删除级联的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();