删除级联的实体框架

时间:2012-01-25 16:09:46

标签: c# entity-framework foreign-keys cascading-deletes

我在删除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属性

enter image description here

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

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

但是,我收到了错误:

  

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

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

5 个答案:

答案 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();