2009-10-22 17 views

cevap

22

Bazen sadece modelleri karıştırmanız gerekir. Deponuzun bu kısmı için SqlBulkCopy kullanın (bu, doğrudan toplu kopyalama API'sine takılı olduğundan) ve diğerlerinin bir kısmı için Varlık Çerçevesi. Ve gerekirse, biraz ADO.NET. Nihayetinde amaç işin yapılmasıdır.

12

LINQ ile Varlıklar arasında toplu eklerin nasıl yapılacağına dair mükemmel bir örnek için bkz. http://archive.msdn.microsoft.com/LinqEntityDataReader. SqlBulkCopy'nin kolay kullanımını sağlayan bir sarıcıdır.

@Marc Gravell doğru, bazen işi tamamlamak için modelleri karıştırmanız gerekir.

+0

oh kabul etmeyenler - burada buldum ölü linki –

+1

... https://github.com /matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs –

6

EF varlıklarını (veya özellik adlarının sütun adlarıyla eşleştiği sürece herhangi bir nesne) toplu olarak yerleştirecek bir sınıf yazdım.

Sınıf, toplu boyutun özelleştirilmesini destekler, önce & posta ekleme olayları, sıraya eklenen ekler ve "firehose modu" (bunu milyar bir nesne verin, yığın boyutuna uygun olacaktır).

2

bir veritabanında veri büyük miktarda ekleyerek, ben bir liste halinde bütün takmadan bilgi toplamak ve bir DataTable Bu listeyi dönüştürmek için kullanılabilir. Sonra bu listeyi SqlBulkCopy aracılığıyla bir veritabanına ekliyorum. Benim oluşturulan listesini gönderin

Ben veritabanına
için takıp InsertData

public static void InsertData<T>(List<T> list,string TabelName) 
     { 
       DataTable dt = new DataTable("MyTable"); 
       clsBulkOperation blk = new clsBulkOperation(); 
       dt = ConvertToDataTable(list); 
       ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 
       using (SqlBulkCopy bulkcopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["SchoolSoulDataEntitiesForReport"].ConnectionString)) 
       { 
        bulkcopy.BulkCopyTimeout = 660; 
        bulkcopy.DestinationTableName = TabelName; 
        bulkcopy.WriteToServer(dt); 
       } 
     }  

public static DataTable ConvertToDataTable<T>(IList<T> data) 
     { 
      PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); 
      DataTable table = new DataTable(); 
      foreach (PropertyDescriptor prop in properties) 
       table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); 
      foreach (T item in data) 
      { 
       DataRow row = table.NewRow(); 
       foreach (PropertyDescriptor prop in properties) 
        row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; 
       table.Rows.Add(row); 
      } 
      return table; 
     } 
olan Toplu ekleme işlemi

InsertData(LiMyList, "MyTable"); 

onu geçmek isteyen tüm toplu verilerin bilgi içeren
LiMyList

3

bulk insert extension

Maksimum performans elde etmek için SqlBulkCopy ve özel veri okuyucuyu kullanır. Sonuç olarak düzenli insert veya efbulkinsert uzantısını kullanarak AddRange

örneği kullanılarak 20'den üzerinde kat daha hızlı olduğunu:

context.BulkInsert(hugeAmountOfEntities); 
+0

THIS harika bir kütüphanedir. SqlBulkCopy şeylerini daha önce sıfırdan yazdım ama bu çok daha kolay ve hızlı – Andrew

İlgili konular