我在删除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属性
然后,我想删除与BokFormats
对象相关的所有Book
项:
var originalBook = m.db.Book.First(x => x.BookID == bookId);
originalBook.BookFormats.Clear();
m.db.SaveChanges();
但是,我收到了错误:
操作失败:无法更改关系,因为 一个或多个外键属性是不可为空的。当一个 改变了关系,相关的外键属性是 设置为空值。如果外键不支持空值, 必须定义新的关系,外键属性必须是 分配了另一个非空值,或者不相关的对象必须是 删除。
我没有关于如何删除这些对象的想法。有什么想法吗?
答案 0 :(得分:17)
您可以使用RemoveRange:
m.db.BookFormats.RemoveRange(originalBook.BookFormats);
m.db.SaveChanges();
但这适用于EF 6.0
答案 1 :(得分:10)
级联删除概念如下:
当您从数据库中删除Book
时,SQL Server将为您删除所有相关的BookFormats
(请注意,如何通过以下方式删除Book
并不重要EF或原始SQL)。因此,它与您的任务无关:“我想删除与BookFormats
相关的所有Book
”。要完成它,你需要这样的东西:
foreach(var m in m.db.BookFormats.Where(f=>f.BookID == bookID))
{
m.db.BookFormats.Remove(m);
}
m.db.SaveChanges();
答案 2 :(得分:4)
您没有从数据库中删除BookFormats
,但是您要删除该关系,从而保留您的BookFormats
并将BookID
列设置为 NULL 。您放在数据库中的删除级联说When I delete the
预订, then delete all of the
BookFormats that have a
BookID equal to mine.
您没有删除正在删除{{1}的格式的图书}。
而不是Book
你应该有这样的东西......
originalBook.BookFormats.Clear()
应该是这样的。我不会在我面前记住EF如何构建EDMX中的删除方法。
答案 3 :(得分:0)
我使用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();
答案 4 :(得分:0)
我在EF 6.1.3中测试了它,这应该可以正常工作:
var originalBook = m.db.Book.First(x => x.BookID == bookId);
originalBook.BookFormats.Clear();
db.Books.Remove(originalBook);
m.db.SaveChanges();