c# - 如何处理相互/递归相关的表?

标签 c# .net sql linq

我对数据库和 sql 还很陌生。我有一个问题,我有两个表都包含另一个主键的外键。我的问题是我有大量元素可以有不同语言的多个名称,但必须有一个主要名称/语言。 alt text http://img688.imageshack.us/img688/1121/11768540.png

首先,我想知道这是否可行,还是我应该放弃?显而易见的解决方案是在 ElementName 表中有一个额外的 bool 字段来表示 IsDefaultName,但它为查询和更新增加了一些额外的复杂性。如果这是最佳解决方案,如果设置了 IsDefaultName 并且该表已经有一个具有相同 ElementIdIsDefaultName 设置(或者我需要手动查询吗)?

我在这里尝试使用 LINQ to SQL。我用来尝试插入新项目的代码在 SubmitChanges 处抛出异常,其中 INSERT 语句与 FOREIGN KEY 约束“FK_ElementName_Element”冲突。 我能理解这是为什么,但想知道是否有修复/更好的解决方案。

var db = new MyDBDataContext();
var element = new Element();
var elementName = new ElementName() {
    ElementName1 = "MyElement",
    Language = "English",
};
element.ElementName = elementName;

db.Elements.InsertOnSubmit(element);
db.ElementNames.InsertOnSubmit(elementName);
db.SubmitChanges();

最佳答案

解决方案一

element
------------------
element_id
~....

element_name
------------------
element_name_id
fk_element_id
name
language_id
is_default_name  Default ( 0 )

Trigger:
if ( ( select count ( 1 ) from element_name where is_default_name = 1 ) > 1 )
BEGIN
    raisError ( 'only 1 element_name may be marked is_default_name = true.', 16, 1 );
END

方案二

element
------------------
element_id ( pk )
~....

element_name
------------------
element_name_id ( pk )
fk_element_id
name
language_id

element_name_default
------------------
fk_element_id
fk_element_name_id
( pk - fk_element_id, fk_element_name_id )

方案三

element
------------------
element_id
fk_element_name_id_default NULL
~....

element_name
------------------
element_name_id
fk_element_id
name
language_id

order of code:
* Insert to element_name
* update of element

我会坚持你所拥有的,因为它很好,只是:

db.Elements.InsertOnSubmit(element);
db.ElementNames.InsertOnSubmit(elementName);
//I don't know this syntax to say
//  set the property of element.fk_element_name_id_default 
//  to the newly inserted elementName from above
db.Elements.?.?

关于c# - 如何处理相互/递归相关的表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3122092/

相关文章:

c# - 结合MVVM、ORM和一些硬件接口(interface)

.net - 无需外部库即可生成自签名证书

c# - WebAPI 如何允许在 Azure AD protected Web api 上进行 LocalHost 调试

sql - 如何在更新父记录时插入一组子记录?

c# - 如何重用 WPF 样式?

c# - C#中的二进制补丁生成

c# - 仅当数据不存在时如何将数据添加到表中?

C# 查找不同按钮颜色之间的路径

mysql - 获取包含确切文本的行

sql - 使用 SQL 获取表的 "transpose"