2016-10-04 27 views
2

如何及時插入具有ComplexType的許多實體?具有ComplexType的BulkInsert實體

考慮以下幾點:

public class Entity { 
    public Address Address { get; set; } 
} 

[ComplexType] 
public class Address { 
    [ColumnName("Street")] 
    public string Street { get; set; } 
} 

我試圖SqlBulkTools而忽略嵌套屬性。 .CustomColumnMapping(x => x.Address.Street, "Street").AddColumn(x => x.Address.Street)都沒有崩潰,但實際上也沒有做任何事情。

我也嘗試過EntityFramework.BulkInsert-ef6這是由ComplexTypes和崩潰混淆。

即使在關閉了ValidateOnSaveEnabled和AutoDetectChangesEnabled的情況下,逐個執行插入也需要很長時間。創建新的上下文並使用數量DbContext.SaveChanges()也沒有幫助。

+3

只是我的看法:我不喜歡EF6附近的任何BulkInsert工具。沒有太多的支持,也沒有人保證他們可以使用更高版本的EF。 (而數據組件太過核心,無法承擔這種風險)。所以只要我想散裝東西。即使它導致更不優雅的解決方案,我也使用舊的優質ADO.NET SqlBulkCopy。 – gsharp

+0

在.Net中運行SQL的最有效方式是ADO.Net。 **沒有任何**會在表演中擊敗這一點。所以,如果你想性能使用ADO.Net SqlBulkCopy(如上所述) – Liam

回答

0

您可以使用實體框架擴展庫輕鬆地做到這一點。

只是一個例子:

//update all Entities with Street of MyStreet to Street of YourStreet 
context.Entities 
    .Where(t => t.Address.Street == "MyStreet") 
    .Update(t => new Entity { t.Address.Street = "YourStreet" }); 

這裏是鏈接:Entity Framework Extended Library

+0

他要求批量插入。這個庫不提供這個功能。 –

-2

免責聲明:我的項目Entity Framework Extensions

這個庫的擁有者允許批量插入(複用類型),但也包括所有其他批量操作。

  • BulkSaveChanges
  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge

// Bulk Insert 
context.BulkInsert(complexTypeEntities); 

// Easy to use 
context.BulkSaveChanges(); 

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

的庫支持但是,圖書館並不是免費的。