我有个这样的模特:
public class Account
{
public int Id { get; set; }
public string Name { get; set; }
public int? ParentId { get; set; }
public Account Parent { get; set; }
}我添加了以下配置:
this.HasOptional(item => item.Parent)
.WithMany()
.HasForeignKey(item => item.ParentId)
.WillCascadeOnDelete(true);然后我收到了以下错误消息:
程序集初始化方法UnitTest.Biz.Accounting.TestInitializer.Init抛出异常。'FK_dbo.acct_Account_dbo.acct_Account_ParentId‘:System.Data.SqlClient.SqlException: System.Data.SqlClient.SqlException:在表'acct_Account’上引入外键约束acct_Account可能会导致循环或多个级联路径。指定“删除不操作”或“更新不操作”,或修改其他外键约束。无法创建约束。
我读过EF的文件,但我不明白我的代码哪里有问题.
如果依赖实体上的外键为空,代码首先不会对关系设置级联删除,而当主体被删除时,外键将被设置为空http://msdn.microsoft.com/en-us/data/jj591620#CascadeDelete
发布于 2014-07-31 10:50:04
自引用表
SQL server不允许自引用表具有级联删除。
如您所见,Server注意到您的级联操作是循环的,它不允许这种类型的级联。这不仅适用于自引用表,而且也适用于级联操作可能具有周期性的表之间的任何关系链。
这就是为什么在EF中,不能在自引用实体上设置级联删除。
.WillCascadeOnDelete(true); // Not allowed.如果依赖实体上的外键是可空的,代码首先不会对关系设置级联删除
是关于EF的默认约定,您可以通过fluent api重写它。如果你有以下代码,
public int? ParentId { get; set; } // <--- nullable
public Account Parent { get; set; }EF默认将级联删除标记为false,即使您不使用WillCascadeOnDelete(false)配置它,这实际上意味着数据库中的外键级联删除将设置为ON DELETE NO ACTION。
目前EF不支持ON DELETE SET NULL,除非您有自定义查询要删除并重新添加约束,检查这个职位。
,当主体被删除时,外键将设置为null.。
这在这个职位中已经解释过了,这意味着只有当子节点被加载到上下文中时。
https://stackoverflow.com/questions/25056031
复制相似问题