更新n:m关系而没有太多开销

时间:2013-05-09 15:09:27

标签: c# .net-4.0 entity-framework-5

我在这三个表之间建立了n:m关系:ProductsKeywordsProductKeywords

现在,每当我更新Product时,我都会为List<Keyword>提供选择的关键字。此集合可以包含已被选为产品关键字的关键字,以及新的或已删除的关键字。现在我想在我的数据库中更新它。

目前我正在清除ProductKeywords等于ProductKeywords.ProductId的整个Product.Id表格。当然,这会产生非常的开销,因为它会清除特定产品的任何关键字。

是否有一种简单的方法来更新此n:m关系而不清除之前的所有产品关键字?因此,它应该删除新List<Keyword>集合中不存在但仍在表中的ProductKeywords,以及添加表中尚未出现但在List<Keyword>中的新ProductKeywords。所有其他人(列于表中并出现在List<Keyword>中)应保持不变,以减少开销。

1 个答案:

答案 0 :(得分:1)

  
      
  1. 它应该删除新的List集合中不存在但仍在表中的ProductKeywords,
  2.   
  3. 以及添加尚未在表格中显示的新ProductKeywords,但在列表中。
  4.   

这是你的两个行动;只需单独完成它们。

List<Keyword> existingKeywordsForProduct = ...;
List<Keyword> newKeywordsForProduct = ...;

var keywordsToRemove = existingKeywordsForProduct.Except(newKeywordsForProduct);
var keywordsToAdd = newKeywordsForProduct.Except(existingKeywordsForProduct);

如果现有关键字相当小,那么您将要将它们全部拉入列表并使用LINQ to Objects进行Except调用。如果列表非常大,那么最好将其保留为IQueryable<Keyword>并进行两次往返,以便可以在数据库端完成Except次调用。