entity framework级联删除 – FOREIGN KEY约束
我有以下型号的问题:
public class ProjectPage { [Key] public Guid Id { get; set; } public Guid? HeaderId { get; set; } public ProjectPage Header { get; set; } public Guid? FooterId { get; set; } public ProjectPage Footer { get; set; } }
在模型创建我有这个:
modelBuilder.Entity().HasOptional(p => p.Header).WithMany().HasForeignKey(p => p.HeaderId).WillCascadeOnDelete(true); modelBuilder.Entity().HasOptional(p => p.Footer).WithMany().HasForeignKey(p => p.FooterId).WillCascadeOnDelete(true);
但我无法更新数据库。 我在Package Manager控制台中遇到以下错误:
在表’ProjectPages’上引入FOREIGN KEY约束’FK_dbo.ProjectPages_dbo.ProjectPages_FooterId’可能会导致循环或多个级联路径。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
有人可以解释如何删除项目页面(可以是另一个项目页面中的页脚或页眉)?
如果有多个级联删除路径可能会导致尝试删除DB中的同一行,则会导致该exception。 想象一下,如果你的ProjectPage
具有相同的Header
和Footer
。 当您尝试删除该ProjectPage
,由于您的关系配置,将有两个路径尝试删除DB中的同一行(一个用于Header
,另一个用于Footer
)。
您可以通过使用Fluent API禁用两个关系之一中的级联删除或将某些关系定义为可选(使用可为空的外键,但无法使用级联删除配置关系)来避免此类不明确的删除路径。
更新
是的,你有两个FK作为选项,但两个关系都配置了级联删除,这就是EF抛出exception的原因。 我的建议只与级联删除设置了一个关系。 关于其他关系,我担心你必须手动完成。 例如,如果您选择手动删除Footer
,那么当您要删除ProjectPage
,必须将Footer
属性设置为null
。 这里的问题是你的数据库中可能有孤儿。 为避免这种情况,您可以覆盖Context上的SaveChanges
来查找和删除孤儿:
public override int SaveChanges() { ProjectPages .Local .Where(r => r.Footer== null && r.FooterId!=default(Guid)).Select(r=>r.FooterId) .ToList() .ForEach(id => ProjectPages.Remove(ProjectPages.Find(id))); return base.SaveChanges(); }
另一种方法是使用default(Guid)
值设置FooterId
。 由于您的PK属性( Id
)的类型是Guid
而且它不是Identity,您必须在将ProjectPage
添加到DB之前设置该属性。 因此,将FooterId
设置为default(Guid)
是另一种标记要删除的实体的方法。 如果您选择此变体,您的SaveChanges
方法可能如下所示:
public override int SaveChanges() { ProjectPages .Local .Where(r => r.Footer!= null && r.FooterId!=default(Guid)).Select(r=>r.Footer) .ToList() .ForEach(pp=> ProjectPages.Remove(pp)); return base.SaveChanges(); }
要么:
public override int SaveChanges() { ProjectPages .Local .Where(r => r.Footer!= null && r.FooterId!=default(Guid)).Select(r=>r.Footer) .ToList() .ForEach(pp=> Entry(pp).State=EntityState.Deleted); return base.SaveChanges(); }
这样就可以避免调用Find
方法。
上述就是C#学习教程:entity framework级联删除 – FOREIGN KEY约束分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1031203.html