2014-04-11 48 views
0

關於如何更新與實體框架的多對多關係的stackoverflow已經有很多問題,但所有這些只使用2-3條記錄(例如用戶和兩個或三個角色)。如何更新大量數據的實體框架中的多對多關係

在答案中,您會看到在加載實體時使用.Include()

但是,如果可能有大量的記錄,如50.000 TYPE1 s和10.000 TYPE2 s,我該如何更新關係。它不可能是非常高性能加載其20.000 TYPE2TYPE1只是多了一個TYPE1添加到它(反之亦然)。

你會怎麼做,與EF(6)?

編輯: 我們正在使用ObjectContext和Model-First方法分離工作。

+0

對於大量的數據,您應該直接訪問交匯表,也許就像[this](http://codereview.stackexchange.com/a/45441/7251)。 –

+0

創建一個存儲過程直接進行更新並將其添加到上下文存儲模型,否則您將不得不加載整組記錄以進行更新。 – Andrew

回答

1

沒有必要使用.Include()加載關係來添加記錄。如果您要添加只是多了一個關係,甚至一對夫婦,你可以做到以下幾點:

假設你有沒有其他列的鏈接表:

Type1 aType1 = dbContext.Type1s.Find(<some type1 id>); 

Type2 aType2 = dbContext.Type2s.Find(<some type2 id>); 

aType1.Type2Collection.Add(aType2); 

dbContext.SaveChanges(); 

也就是說,如果你的鏈接表中有其他列,那麼你可以這樣做:

Type1 aType1 = dbContext.Type1s.Find(<some type1 id>); 

Type2 aType2 = dbContext.Type2s.Find(<some type2 id>); 

TypeRelationships rel = new TypeRelationship() 
{ 
Type1Id = aType1.Id, 
Type2Id = aType2.Id, 
// Other column values here 
}; 

dbContext.TypeRelationships.Add(rel); 

dbContext.SaveChanges(); 

或者,你可以簡單地從你的DbContext執行原始SQL語句,像這樣:

dbContext.Database.ExecuteSqlCommand(@"INSERT INTO [dbo].[TypeRelationships] (Type1Id, Type2Id) VALUES (type1Id, type2Id)"); 

注意:確保在執行此操作時使用參數值,我只是顯示要執行的方法。

最後,EF將爲每個INSERT語句執行單個查詢。如果您有1000個要插入,請考慮使用表值參數和原始ADO執行存儲過程。

+0

您的第一個示例假設我正在處理附屬實體嗎?它在使用ObjectContext而不是DbContext工作時是如何改變事物的? –

+0

@JoDavid嗯,好吧我也許假設了! :-)我不是這方面的專家,但下面的鏈接有幫助嗎? http://www.entityframeworktutorial.net/update-many-to-many-entities-in-entity-framework.aspx –