实体框架级联删除——FOREIGNKEY约束我对以下模型有问题:publicclassProjectPage{[Key]publicGuidId{get;放;}public}publicProjectPageHeader{get;放;公共指南?FooterId{得到;放;}publicProjectPageFooter{get;放;在模型创建中,我有这个:modelBuilder.Entity().HasOptional(p=>p.Footer).WithMany().HasForeignKey(p=>p.FooterId).WillCascadeOnDelete(true);但是我无法更新数据库。我在包管理器控制台中收到以下错误:在表“ProjectPages”上引入外键约束“FK_dbo.ProjectPages_dbo.ProjectPages_FooterId”可能会导致循环或多个级联路径。指定ONDELETENOACTION或ONUPDATENOACTION,或修改其他FOREIGNKEY约束。有人可以解释如何删除项目页面(可以是另一个项目页面中的页脚或页眉)吗?如果有多个级联删除路径可能导致尝试删除数据库中的同一行,则会导致此异常。想象一下,如果您的ProjectPage具有相同的页眉和页脚。当您尝试删除该ProjectPage时,由于您的关系配置,将有两条路径试图删除数据库中的同一行(一条用于页眉,另一条用于页脚)。您可以通过使用FluentAPI在两个关系之一中禁用级联删除或将某些关系定义为可选(具有可为空的外键,但您不能配置具有级联删除的关系)删除路径来避免这种歧义。更新是的,您有两个FK作为选项,但是这两个关系都配置了级联删除,这就是EF抛出异常的原因。我的建议只和级联删除建立关系。关于其他关系,恐怕你必须手动完成。例如,如果您选择手动删除Footer,那么当您删除ProjectPage时,您必须将Footer属性设置为null。这里的问题是您的数据库中可能有孤儿。为避免这种情况,您可以覆盖Context上的SaveChanges以查找和删除孤儿:.Select(r=>r.FooterId).ToList().ForEach(id=>ProjectPages.Remove(ProjectPages.Find(id)));返回base.SaveChanges();另一种方法是使用默认的(Guid)值设置FooterId。由于您的PK属性(Id)是Guid类型而不是Identity,因此您必须在将ProjectPage添加到数据库之前设置该属性。因此,将FooterId设置为default(Guid)是另一种将实体标记为删除的方法。如果您选择此变体,您的SaveChanges方法可能如下所示:publicoverrideintSaveChanges(){ProjectPages.Local.Where(r=>r.Footer!=null&&r.FooterId!=default(Guid))。选择(r=>r.Footer).ToList().ForEach(pp=>ProjectPages.Remove(pp));返回base.SaveChanges();}或:publicoverrideintSaveChanges(){ProjectPages.Local.Where(r=>r.Footer!=null&&r.FooterId!=default(Guid)).Select(r=>r.Footer).ToList().ForEach(pp=>Entry(pp).State=EntityState.Deleted);返回base.SaveChanges();这避免了调用Find方法。以上就是C#学习教程:实体框架级联删除-FOREIGNKEY约束分享的全部内容,如果对你有用还需要进一步了解C#学习教程,希望大家多多关注——本文收藏来自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
