繁体   English   中英

删除级联上的实体框架

[英]Entity Framework on delete cascade

我在删除实体框架4.1中的相关行时遇到问题。 我有关系的桌子

书1 <---> *书格式

我已经设置了on delete级联:

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

但是,我得到了错误:

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

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

您可以使用RemoveRange:

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

但这是针对EF 6.0

级联删除的概念如下:

当您从数据库中删除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();

您不是要从数据库中删除BookFormats ,而是要删除关系,从而使您的BookFormats并将BookID列设置为NULL 您放在数据库中的删除级联显示“ When I delete the Book时, then delete all of the BookID equal to mine. that have a BookFormat” equal to mine. 您不是要删除图书,而是要从Book中删除格式。

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

List<int> idsToDelete = new List<int>();

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方法的。

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

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

我使用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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM