首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架是否支持删除记录并将外键设置为空?

问实体框架是否支持删除记录并将外键设置为空?
EN

Stack Overflow用户
提问于 2014-07-31 10:00:25
回答 1查看 3.9K关注 0票数 5

我有个这样的模特:

代码语言:javascript
复制
public class Account
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public Account Parent { get; set; }
}

我添加了以下配置:

代码语言:javascript
复制
    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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-31 10:50:04

自引用表

SQL server不允许自引用表具有级联删除。

如您所见,Server注意到您的级联操作是循环的,它不允许这种类型的级联。这不仅适用于自引用表,而且也适用于级联操作可能具有周期性的表之间的任何关系链。

来源

这就是为什么在EF中,不能在自引用实体上设置级联删除。

代码语言:javascript
复制
.WillCascadeOnDelete(true); // Not allowed.

如果依赖实体上的外键是可空的,代码首先不会对关系设置级联删除

是关于EF的默认约定,您可以通过fluent api重写它。如果你有以下代码,

代码语言:javascript
复制
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.。

这在这个职位中已经解释过了,这意味着只有当子节点被加载到上下文中时。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25056031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档