Database 试图删除(*)和(*)之间的关系。然而,其中一种关系';s外键(X)不能设置为空

Database 试图删除(*)和(*)之间的关系。然而,其中一种关系';s外键(X)不能设置为空,database,linq-to-sql,foreign-keys,default-value,Database,Linq To Sql,Foreign Keys,Default Value,我有一个SQL Server表结构,其中某些列中有外键,它们引用不同的查找表。这些列被创建为NOT NULL,并且DEFAULT value=1作为ID=1的查找值是我在保存记录时传递NULL时要指定的默认值 但是,我在尝试添加/更新/删除此子表的记录时遇到以下错误 An attempt was made to remove a relationship between a (*) and a (*). However, one of the relationship's foreign key

我有一个SQL Server表结构,其中某些列中有外键,它们引用不同的查找表。这些列被创建为
NOT NULL
,并且
DEFAULT value=1
作为
ID=1
的查找值是我在保存记录时传递
NULL
时要指定的默认值

但是,我在尝试添加/更新/删除此子表的记录时遇到以下错误

An attempt was made to remove a relationship between a (*) and a (*). However, one of the relationship's foreign keys (X) cannot be set to null. 
我尝试了很多搜索,但我得到了一个解决方案,将LINQ手动更改为SQL代码或XML来解决这个问题。我不能这样做,因为将来当表发生更改时,我必须确保每次都应用手动更改

此外,我不能将我的列更改为接受
NULL
,因为这将通过LINQ to SQL影响使用相同表的其他应用程序


我需要更易于管理的解决方案

我假设您正试图通过将
null
赋值给引用来“重置”其默认值,期望L2S采用数据库默认值。但是,对于L2S,您只会使外键无效。它不知道数据库中有任何默认值


因此,您必须通过自己将其设置为默认查找对象来更改引用。您可以通过向类中添加一个
Reset()
方法来实现这一点,这样您就不必将这些代码分散到各处。

我通过将默认值从代码本身分配给表类属性来解决这一问题。我的理解是这样的。LINQ to SQL不考虑数据库中设置的默认值。此外,该列不为NULL。因此,作为INT列,.NET为这些属性指定的默认值是0。现在,我的数据库中没有ID=0的主条目。此外,由于DB没有为此列获取空值,因此它根本不尝试应用默认值

因此,我所做的是,在保存记录之前,如果我发现绑定到此属性的控件具有空值(未选择任何内容/控件不可见等),我将从其自身的代码中指定默认值。这样就不需要依靠数据库来分配默认值

现在,一切正常。我想和大家分享一下,因为我在任何地方都找不到满意的答案