[英]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.