使用EF导入大量互连数据

本文关键字:数据 EF 导入 使用 | 更新日期: 2023-09-27 18:29:25

所以我需要进口(目前)大约15000种产品。每个产品都有20个属性,还有属于其他表的信息,例如,用于该产品的仓库。为了避免多次保存相同的信息,我创建了一个Warehouse表,其中包含地址、名称和id。名称和地址是我运行的导入中列出的。

现在,数据库中可能存在也可能不存在与产品相关的其他链接数据。

我目前这样做的方式是,在我找到相关条目时检查它们是否存在,如果不存在,我会使用另一个上下文将它们添加到数据库中,并返回新生成的实体的id。实际产品被添加到"主"上下文中,并在添加完所有产品后保存。类似这样的东西:

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

虽然这在一定程度上适用于当前的数据量,但它仍然相当缓慢,所以我想知道,有什么更好的方法可以做到这一点?

使用EF导入大量互连数据

Linq在处理大量数据时并不是很好。你可以做一个膨胀剂。这里有一个将支持大量数据的建议:

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