2009-10-22 14 views

Odpowiedz

22

Czasami trzeba po prostu wymieszać modele. Być może użyj SqlBulkCopy dla tej części twojego repozytorium (ponieważ jest to wtyczka bezpośrednio do interfejsu API) i Entity Framework dla pozostałych elementów. A jeśli to konieczne, trochę bezpośredniego ADO.NET. Ostatecznie celem jest wykonanie pracy.

12

Aby uzyskać doskonały przykład wstawiania materiałów wsadowych z LINQ do jednostek, patrz http://archive.msdn.microsoft.com/LinqEntityDataReader. Jest to opakowanie, które umożliwia łatwe korzystanie z SqlBulkCopy.

@Marc Gravell jest poprawny, czasami trzeba mieszać modele, aby wykonać zadanie.

+0

oh sieci doskonałości - niedziałający link –

+1

znaleźć go tutaj ... https://github.com /matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs –

6

Napisałem klasę, która będzie wstawiała elementy EF luzem (lub jakikolwiek obiekt, o ile nazwy właściwości pasują do nazw kolumn).

Ta klasa obsługuje dostosowywanie rozmiaru wsadu, pre & zdarzeń wstawiania wstawek, wstawiania w kolejce i "trybu w trybie firehose" (nadaj mu miliard obiektów, będzie przestrzegać wielkości partii).

2

wstawiania ogromne ilości danych w bazie danych, kiedyś zebrać wszystkie informacje na wstawienie do listy i konwertować do tej listy w DataTable. Następnie wstawiam tę listę do bazy danych poprzez SqlBulkCopy.

Gdzie mogę wysłać moje wygenerowane listy
LiMyList
które zawierają informacje o wszystkich danych luzem, które chcę wstawić do bazy
i przekazać ją do mojego zbiorczej operacji wstawiania

InsertData(LiMyList, "MyTable"); 

Gdzie InsertData jest

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; 
     } 
3

Możesz to zrobić, używając bulk insert extension

Używa SqlBulkCopy i niestandardowego datareader, aby uzyskać maksymalną wydajność. W rezultacie jest to ponad 20 razy szybciej niż przy użyciu zwykłego wkładkę lub AddRange

próbkę za pomocą efbulkinsert rozszerzenia:

context.BulkInsert(hugeAmountOfEntities); 
+0

To jest niesamowita biblioteka. Napisałem SqlBulkCopy od początku, ale jest to o wiele łatwiejsze i szybsze – Andrew

Powiązane problemy