C# EF delete正在尝试更新外键

C# EF delete正在尝试更新外键,c#,sql-server-2008,entity-framework,entity-framework-4,C#,Sql Server 2008,Entity Framework,Entity Framework 4,假设我有这个场景: Table Bar Id int not null Name string not null 及 当我尝试删除在Foo中有引用的条时,为什么EF尝试将Foo设置BarId更新为NULL 我在我的属性上有一个验证,当有人试图将NULL设置为Bar时会引发该验证,而当EF试图更新Foo时,我会遇到这个错误 如果我尝试删除执行类似“delete from foo where id=1”的查询,我会得到: 我想在使用EF时得到这个错误。有什么办法吗? 我用的是EF4.3 这是我的地

假设我有这个场景:

Table Bar
Id int not null
Name string not null

当我尝试删除在Foo中有引用的条时,为什么EF尝试将Foo设置BarId更新为NULL

我在我的属性上有一个验证,当有人试图将NULL设置为Bar时会引发该验证,而当EF试图更新Foo时,我会遇到这个错误

如果我尝试删除执行类似“delete from foo where id=1”的查询,我会得到:

我想在使用EF时得到这个错误。有什么办法吗? 我用的是EF4.3

这是我的地图:

 modelBuilder.Entity<Bar>().HasRequired(x => x.Foo).WithMany().Map(x => x.MapKey("FooId")).WillCascadeOnDelete(false);
modelBuilder.Entity();

使用这两种方法“从数据库中删除项目”通常是不正确的。准确地说,是这样的:

DeleteObject(实体)将实体标记为已在上下文中删除。(它的EntityState在此之后被删除。)如果之后调用SaveChanges,EF将向数据库发送一条SQL DELETE语句。如果数据库中没有违反引用约束,则将删除实体,否则将引发异常

EntityCollection.Remove(childEntity)将父实体和子实体之间的关系标记为已删除。如果从数据库中删除了childEntity本身,那么调用SaveChanges时会发生什么具体情况取决于两者之间的关系类型:

如果关系是可选的,即数据库中从子项引用到父项的外键允许空值,则此外键将设置为空,如果调用SaveChanges,则childEntity的此空值将写入数据库(即,删除两者之间的关系)。这在SQL UPDATE语句中发生。不会出现DELETE语句

如果关系是必需的(FK不允许空值),并且关系没有标识(这意味着外键不是子项(复合)主键的一部分),则必须将子项添加到另一个父项,或者必须显式删除子项(然后使用DeleteObject)。如果不执行这些操作,则会违反引用约束,并且在调用SaveChanges时EF将引发异常-臭名昭著的“由于一个或多个外键属性不可为null,因此关系无法更改”异常或类似异常

如果关系正在标识(因为主键的任何部分都不能为NULL,所以它是必需的),EF也会将childEntity标记为已删除。如果调用SaveChanges,将向数据库发送SQL DELETE语句。如果数据库中没有违反其他引用约束,则将删除实体,否则将引发异常

实际上,我对您链接的MSDN页面上的备注部分感到有点困惑,因为它说:“如果关系具有引用完整性约束,则对依赖对象调用Remove方法会将关系和依赖对象标记为删除。”。这对我来说似乎不精确,甚至是错误的,因为上面三种情况都有一个“引用完整性约束”,但只有在最后一种情况下,孩子实际上被删除了。(除非它们与“从属对象”一起表示参与标识关系的对象,但这是一个不寻常的术语。)


来源:

由于约束,它试图将BarId设置为null。您没有级联删除,外键列需要值或null。您可以发布您的约束吗?但我的列不接受NULL。约束:使用复选添加约束[CargoRaiz_Instituico]外键([Instituico_Id])的ALTER TABLE[dbo].[Cargo]引用[dbo].[Instituico]([Id])
The DELETE statement conflicted with the REFERENCE constraint "FooFK".
The conflict occurred in database "teste", table "dbo.Bar", column 'BarId'.
 modelBuilder.Entity<Bar>().HasRequired(x => x.Foo).WithMany().Map(x => x.MapKey("FooId")).WillCascadeOnDelete(false);