2009-10-22 2 views

답변

22

때때로 모델을 혼합해야합니다. 아마도 저장소의이 부분에 SqlBulkCopy을 사용하고 (이는 대량 복사 API에 직접 연결되므로) 나머지 중 일부는 Entity Framework를 사용합니다. 그리고 필요한 경우, 직접 ADO.NET의 비트. 궁극적으로 목표는 작업을 완료하는 것입니다.

12

LINQ to Entities를 사용하여 대량 삽입을 수행하는 방법에 대한 완벽한 예는 http://archive.msdn.microsoft.com/LinqEntityDataReader을 참조하십시오. SqlBulkCopy를 쉽게 사용할 수있는 래퍼입니다.

@Marc Gravell은 정확합니다. 작업을 완료하기 위해 모델을 혼합해야하는 경우가 있습니다.

+0

오 noes - 여기를 발견 죽은 링크 –

+1

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

6

EF 엔티티 (또는 속성 이름이 열 이름과 일치하는 한 모든 종류의 개체)를 대량 삽입 할 클래스를 작성했습니다.

클래스는 일괄 처리 크기, 이전 & 포스트 삽입 이벤트, 대기열 삽입 및 "Firehose 모드"(10 억 개의 개체를 부여하면 배치 크기를 준수 함) 사용자 지정을 지원합니다.

2

데이터베이스에 대량의 데이터를 삽입, 나는 목록에 모든 삽입 정보를 수집하고 DataTable에이 목록을 변환하는 데 사용. 그런 다음 해당 목록을 SqlBulkCopy을 통해 데이터베이스에 삽입합니다. 내 생성 된 목록을 보내

나는 데이터베이스
에 삽입하고 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; 
     } 
내 대량 삽입 작업

InsertData(LiMyList, "MyTable"); 

에 전달하려는 모든 대량의 데이터 정보를 포함
LiMyList

3

bulk insert extension

최대 성능을 얻기 위해 SqlBulkCopy 및 사용자 지정 데이터 사용을 사용합니다. 그 결과는 정기적으로 삽입 또는 efbulkinsert 확장 사용 AddRange

샘플 사용하는 것보다 20 배 빠른 :

context.BulkInsert(hugeAmountOfEntities); 
+0

이것은 멋진 라이브러리입니다. 이전부터 SqlBulkCopy를 작성했는데 이것은 훨씬 쉽고 빠릅니다. – Andrew