删除级联的entity framework

我在删除Entity Framework 4.1中的相关行时遇到问题。 我有关系表

书1 * BookFormats

我已经设置了删除级联:

ALTER TABLE [dbo].[BookFormats] WITH CHECK ADD CONSTRAINT [FK_BookFormats_Book] FOREIGN KEY([BookID]) REFERENCES [dbo].[Book] ([BookID]) on delete cascade 

EDMX属性

在此处输入图像描述

然后,我想删除与我的Book对象相关的所有BokFormats项:

  var originalBook = m.db.Book.First(x => x.BookID == bookId); originalBook.BookFormats.Clear(); m.db.SaveChanges(); 

但是,我得到错误:

操作失败:无法更改关系,因为一个或多个外键属性不可为空。 当对关系进行更改时,相关的外键属性将设置为空值。 如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

我没有关于如何删除这些对象的想法。 有任何想法吗?

级联删除概念如下:

当您从数据库中删除Book ,SQL Server将删除所有相关的BookFormats (请注意,如何通过EF或原始SQL启动Book删除无关紧要)。 因此,它与您的任务无关:“我想删除与我的Book相关的所有BookFormats ”。 要完成它,你需要这样的东西:

 foreach(var m in m.db.BookFormats.Where(f=>f.BookID == bookID)) { m.db.BookFormats.Remove(m); } m.db.SaveChanges(); 

您可以使用RemoveRange:

 m.db.BookFormats.RemoveRange(originalBook.BookFormats); m.db.SaveChanges(); 

但这适用于EF 6.0

您没有从数据库中删除BookFormats ,但是您要删除该关系,从而保留BookFormats并将BookID列设置为NULL 。 您放在数据库中的删除级联说When I delete the Book时, then delete all of the BookID equal to mine. that have a BookFormats equal to mine. 您没有删除要从书中删除格式的Book

而不是originalBook.BookFormats.Clear()你应该有这样的东西……

 List idsToDelete = new List(); foreach (BookFormat bf in originalBook.BookFormats) { idsToDelete.Add(bf.ID); } foreach (int id in idsToDelete) { BookFormat format = m.db.BookFormat.FirstOrDefault(x => x.ID == id); if (format != null) { m.db.DeleteBookFormat(format); } } m.db.SaveChanges(); 

应该是这样的。 我没有在我面前记住EF如何构建EDMX中的delete方法。

我使用EF6,这是有效的。

  var itemBinding = db.ItemBinding.Where(x => x.BindingToId == id) ; foreach (var ib in itemBinding) { db.Item.Remove(ib.Item); db.ItemBinding.Remove(ib); } db.SaveChanges(); 

我已经在EF 6.1.3中对它进行了测试,这应该可以正常工作:

  var originalBook = m.db.Book.First(x => x.BookID == bookId); originalBook.BookFormats.Clear(); db.Books.Remove(originalBook); m.db.SaveChanges();