删除级联的实体框架

Ton*_*ony 14 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
Run Code Online (Sandbox Code Playgroud)

EDMX属性

在此输入图像描述

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

 var originalBook = m.db.Book.First(x => x.BookID == bookId);
 originalBook.BookFormats.Clear();
 m.db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

但是,我得到错误:

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

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

Say*_*kor 17

您可以使用RemoveRange:

m.db.BookFormats.RemoveRange(originalBook.BookFormats);
m.db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

但这适用于EF 6.0


Vit*_*nin 11

级联删除概念如下:

当您Book从数据库BookFormats中删除时,SQL Server将删除所有相关内容(请注意,删除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();
Run Code Online (Sandbox Code Playgroud)