我有这样的模型:
public class Account
{
public int Id { get; set; }
public string Name { get; set; }
public int? ParentId { get; set; }
public Account Parent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我添加以下配置:
this.HasOptional(item => item.Parent)
.WithMany()
.HasForeignKey(item => item.ParentId)
.WillCascadeOnDelete(true);
Run Code Online (Sandbox Code Playgroud)
然后我收到以下错误消息:
程序集初始化方法UnitTest.Biz.Accounting.TestInitializer.Init引发异常.System.Data.SqlClient.SqlException:System.Data.SqlClient.SqlException:在表'acct_Account'上引入FOREIGN KEY约束'FK_dbo.acct_Account_dbo.acct_Account_ParentId'可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束.无法创建约束.
我已经阅读了EF的文档,但我不明白我的代码在哪里出错...
如果依赖实体上的外键可以为空,则Code First不会在关系上设置级联删除,并且当删除主体时,外键将设置为null http://msdn.microsoft.com/en-us/数据/ jj591620#CascadeDelete
自我参考表
SQL Server不允许自引用表进行级联删除.
如您所见,SQL Server注意到您的级联操作是循环的,并且它不允许这种类型的级联.这不仅适用于自引用表,而且适用于级联操作可能具有周期性的表之间的任何关系链.
这就是为什么在EF中你无法在自引用实体上设置级联删除.
.WillCascadeOnDelete(true); // Not allowed.
Run Code Online (Sandbox Code Playgroud)
如果依赖实体上的外键可以为空,则Code First不会在关系上设置级联删除
是关于EF 的默认约定,您可以通过流畅的api覆盖它.如果您有以下代码,
public int? ParentId { get; set; } // <--- nullable
public Account Parent { get; set; }
Run Code Online (Sandbox Code Playgroud)
默认情况下,EF会将级联删除标记为false,即使您没有配置它WillCascadeOnDelete(false),这实际上意味着数据库中的外键级联删除将被设置为ON DELETE NO ACTION.
目前EF不支持,ON DELETE SET NULL除非您有自定义查询删除并重新添加约束,请查看此帖子.
当删除主体时,外键将设置为null.
这篇文章已经解释过,这意味着只有孩子被加载到上下文中.
| 归档时间: |
|
| 查看次数: |
3377 次 |
| 最近记录: |