Импорт многих взаимосвязанных данных с EF - PullRequest
0 голосов
/ 30 марта 2012

Итак, мне нужно импортировать (в настоящее время) около 15 тыс. Товаров. Каждый продукт имеет 20 свойств, а также информацию, относящуюся к другим таблицам - например, склад, используемый для этого продукта. Чтобы избежать сохранения одной и той же информации несколько раз, я создал Warehouse-таблицу, которая содержит адрес, имя и идентификатор. Имя и адрес указаны в списке, который я запускаю.

Теперь есть другие связанные данные, связанные с продуктом, которые могут или не могут существовать в базе данных.

В настоящее время я делаю это, проверяя, существуют ли связанные записи по мере их поступления, а если нет, я добавляю их в базу данных, используя другой контекст, и возвращаю идентификатор вновь созданного объекта. Фактические продукты добавляются в «основной» контекст и сохраняются после добавления всех. Как то так:

using (var context = new MyContext())
{
  foreach (var product in productList)
  {
      CheckWarehouse(product);
      CreateEntityFromProduct(product);
  }
  context.SaveChanges();
}

Хотя это в некоторой степени работает с текущим объемом данных, оно все еще довольно медленное, поэтому мне интересно, что может быть лучше для этого?

1 Ответ

1 голос
/ 30 марта 2012

Linq не так хорош с большим количеством данных. Вы могли бы сделать Bulkinsert. Вот предложение, которое будет поддерживать большой объем данных:

void Main()
{
    //Your list of objects
    List<MyObject> TheListOfMyObjects=new List<MyObject>();

    var dt=new DataTable();
    dt.Columns.Add("Prop1",typeof(int));
    dt.Columns.Add("Prop2",typeof(string));
    foreach (var TheObject in TheListOfMyObjects)
    {
        dt.Rows.Add(TheObject.Prop1,TheObject.Prop2);
    }
    InsertWithBulk(dt,"YourConnnectionString","MyObject");
}
private void InsertWithBulk(DataTable dt,string connectionString,string tableName)
{
    using (SqlConnection destinationConnection =new SqlConnection(connectionString))
    {
        destinationConnection.Open();
        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
        {
            bulkCopy.DestinationTableName =tableName;

            try
            {
                bulkCopy.WriteToServer(dt);
            }
            catch (Exception ex)
            {
                //Exception from the bulk copy
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...