2012-04-30 39 views
3

首先,让刚刚与我的错误就开始:LINQ到SQL:错误删除多对多的关系

"An attempt was made to remove a relationship between X and Y. However, one of the relationship's foreign keys cannot be set to null"

现在为我所试图做的解释...

我有以下数据库表格:样本,男性,女性,样本关系。男性总是一个标本,女性总是一个标本。所以一个标本有两个一对多的关系(但是逻辑防止一个标本同时设置)。另外,男性可以有一对多的女朋友,而女性也可以有一对多的男朋友(嘿,毕竟这是21世纪的)。这已通过创建多对多表(SpecimenRelationship)来解决。

SQL中的关系设置为使样本删除级联到男性和女性。之后,所需的功能是删除男性/女性级联到SpecimenRelationship - 但由于SQL限制(多循环路径垃圾!),这是没有完成。所以一个级联,另一个是SetNull(可以说男性是SetNull)。

现在为哪里出问题了。当我从男性实体中删除样本关系时,我会收到上述错误。但为什么会发生?我没有看到我甚至删除了Male实体,我不知道Linq-to-Sql是如何工作的,为什么这不是直接删除一个SpecimenRelationship条目?

下面是一些示例代码:

Male male = GetMaleFromDataContext(); 

SpecimenRelationship relationshipToRemove = male.SpecimenRelationships.Single(x => x.FemaleID == someFemaleID); 

male.SpecimenRelationships.Remove(relationshipToRemove); 

DB.SubmitChanges();//error thrown here 

为什么关系级联甚至开始发挥作用吗?

+0

看看以前的答案我的:http://stackoverflow.com/a/1182944/15541其实,我有一个更好的回答下面一点:http://stackoverflow.com/a/1183189/ 15541 – leppie

+0

您的样本关系表是否有可空的对男性和女性表格的引用? – baileyrt

+0

@baileyrt:不,它没有空值引用 – musefan

回答

0

在表上创建关系时,外键列的NULL约束会自动设置为NOT NULL。

您需要将其设置为NULL,并且您的级联规则将起作用(我认为)。

设计模式(Management Studio)中的属性名称为允许空值。