Linq,Lambda表达式

3
我有一个“多对多”的关系数据库。我正在尝试使用 lambda 和 linq 从 Many-to-many 表中删除一条记录。
我有一个 Ado-entity,名为 Book,和另一个名为 Author 的 Ado-entity。Book 包含导航属性 Authors,而 Author 包含属性 Books。
现在我想要从我的数据库中删除一本书。为了做到这一点,我必须删除 AuthorBooks 表中它的外键,但这证明是困难的。
这是我目前的语法:
var a = db.db.Authors.Select(c => db.db.Authors.Where(c.Books.Contains(book));

这个在Visual Studio中不能被接受,我不知道如何到达我想要的地方。提前致谢!

我的错误截图:


http://olofd.dyndns.org:8887/pic1.PNG


http://olofd.dyndns.org:8887/pic2.PNG


http://olofd.dyndns.org:8887/pic3.PNG


出于好奇,为什么这不是一个“书籍”,“作者”,“书籍作者”模型(带有独立的连接表)? - Brad Christie
2个回答

2
以下代码应该可以解决这个问题:
book = db.Books.Single(b => b.BookId == book.BookId);
 var bookCopies = db.BookCopies.Where(c => c.BookId == book.BookId).ToList();

 foreach (BookCopy c in bookCopies)
 {
     db.BookCopies.DeleteObject(c);
 }

 var authors = db.Authors.Include("Books").Where(author => author.Books.Any(b => b.BookId == book.BookId)).ToList();

 foreach (Author a in authors)
 {
     a.Books.Remove(book);
 }

 db.DeleteObject(book);
 db.SaveChanges();

你遇到错误的原因是在加载作者时没有包含书籍关系。因此,你遍历了一个作者集合,而每个作者都没有书籍。移除书籍操作 a.Books.Remove(book) 没有起到任何作用。
当检查 db.ObjectStatemanger 时,可以看到发生了这种情况。你删除了实体,但状态管理器中没有显示任何内容。
你还需要在查询中添加 ToList() 方法。否则,你将从与正在迭代的集合相同的集合中删除实体,这将导致异常。

啊!太感谢了!有了你的代码,我只剩下一个问题。借阅中仍然引用了书籍副本。所以我不能删除已经被借出的书籍。我尝试添加了这个循环,但没有成功,你有什么想法吗?:foreach(BookCopy bookcopy in bookCopies){var loansWithBook = bookcopy.Loans.Where(loan => loan.BookCopyID == bookcopy.BookCopiesID);foreach(Loan e in loansWithBook){db.db.Loans.DeleteObject(e);}}} - Objective Coder
在foreach循环中添加.ToList()使其正常工作。这样就解决了“集合已修改”的异常问题。非常感谢! - Objective Coder

2

看起来你在多次重复输入过多的内容。我预期它应该类似于:

var authors = db.Authors.Where(author => author.Books.Contains(book));

说实话,我希望当您删除实体时,LINQ已经为您删除了外键关系 - 您确定它没有这样做吗?

谢谢!这很好用,但我该如何在此之后删除这本书呢?我正在尝试使用foreach循环遍历它,但是如何删除指定的书呢?抱歉我的问题一开始没有问到这个,这就是我想要做的事情,但它并没有起作用: foreach(作者a in作者) { a.Books.Remove(book); } - Objective Coder
不,它不会删除关系。它会给我这个异常:操作失败:无法更改关系,因为一个或多个外键属性是非空的。当对关系进行更改时,相关的外键属性将设置为 null 值。如果外键不支持 null 值,则必须定义新的关系,将外键属性分配给另一个非 null 值,或删除不相关的对象。 - Objective Coder
@ObjectiveCoder:当你说“它给我这个异常”时,你是在做什么?你只是试图删除书本本身吗?如果你能展示一下生成的LINQ中关系的样子以及你尝试过的和结果,那将会很有用。(请将其编辑到问题中而不是添加评论。) - Jon Skeet
你收到了Jon请求的内容吗? - Objective Coder
@ObjectiveCoder:发布文本会比让每个人都盯着截图更有用,但是现在我们可以看到了。顺便问一下,你为什么需要到处引用 db.db?这看起来不太好。另外,你也没有展示如果只尝试在 Book 上调用 DeleteObject 会发生什么。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接