2017-01-16 69 views
0

我有一個一對多關係用EntityFramework代碼優先定義。例如:BigEntity包含SmallEntitiesList(SmallEntity的列表o)。如何使實體框架在一次到數據庫中插入條目

Whenver我更新對象的SmallEntities名單,我執行dbContext.SaveChanges(),我可以在SQL記錄的是實體框架通過使往返於數據庫中每一個插入這些項目看。

所以日誌看起來像這樣:

Log for inserting SmallEntities

每個插件看起來是這樣的:

DECLARE 
    updatedRowid ROWID; 
BEGIN 


INSERT INTO SOME_TABLE(...) 
VALUES (...) 

RETURNING ROWID INTO updatedRowid; 
OPEN '' /* @outParameter */ FOR SELECT 
    SOME_TABLE 
FROM SOME_TABLE 
WHERE ROWID = updatedRowid; 
END; 

有沒有一種方法,使實體框架的行爲不同,使這些插入爲每個數據庫旅行?

更新:已經嘗試BulkInsert(不支持Oracle DevArt,這是我使用的)。

+0

請檢查我的回答希望這會幫助你。我在我的項目中使用這個。 –

回答

0
foreach(var item in ListItems) 
{ 
    context.Entry(item).State = System.Data.EntityState.Added; 
    context.Add(item); 
} 

context.SaveChanges(); 

OR

foreach (var item in objectList) 
{ 
    context.YourObject.AddObject(item); 
} 

context.SaveChanges(SaveOptions.None); 

OR

研究 - BulkInsert();

+0

你的兩個解決方案都是這樣做的,結果沒有變化,每個實體都有相同次數的數據庫訪問。 – user2997779

+0

看看這個。 http://stackoverflow.com/questions/36209302/would-it-be-best-to-call-context-savechanges-only-once – TdAth

+0

或者只是使用一個存儲過程:) – TdAth

1

如果您使用EF(版本6)6.1.3那麼您可以通過提供EntityFramework.BulkInsert擴展來實現此目的。它將在單個調用中插入對象列表,這將極大地提高應用程序的性能。 形式更多信息檢查了這一點。

https://efbulkinsert.codeplex.com/

+0

除非你定吧,這不會使用圖層次結構。它只會插入一個級別。您還需要小心批量插入選項,就好像您不小心一樣,它可以繞過您的許多規則。 –

+0

@DanielLorenz抱歉,我沒有明白你的意思。你能告訴我在哪裏可以閱讀更多關於你所說的話嗎?另外問題是插入單個實體的批量插入,我認爲BulkInsert對此很有幫助。 –

+0

「我有一個定義的一個一對多關係的EntityFramework代碼爲先」的 這意味着他節省了父實體,並在同一時間它的孩子實體。您的批量插入解決方案只會自動插入父實體,而不是子實體。因此,您必須手動循環遍歷樹,這可能會導致將來出現問題。 –

0

免責聲明:我的Entity Framework Extensions

這個庫支持所有者所有主要providor包括:

  • 甲骨文DevArt
  • 的Oracle數據訪問
  • 甲骨文DataAccessManaged

這個庫可以讓你執行你需要爲你的場景的所有批量操作:

  • 散裝的SaveChanges
  • 容量插入
  • 批量刪除
  • 批量更新
  • 散裝合併

// Easy to use 
context.BulkSaveChanges(); 

// Easy to customize 
context.BulkSaveChanges(bulk => bulk.BatchSize = 100); 

// Perform Bulk Operations 
context.BulkDelete(customers); 
context.BulkInsert(customers); 
context.BulkUpdate(customers); 

// Customize Primary Key 
context.BulkMerge(customers, operation => { 
    operation.ColumnPrimaryKeyExpression = 
     customer => customer.Code; 
});