C# 使用EF导入大量互连数据

C# 使用EF导入大量互连数据,c#,entity-framework-4,C#,Entity Framework 4,因此,我需要进口(目前)约1.5万种产品。每个产品有20个属性,以及属于其他表的信息,例如,用于此产品的仓库。为了避免多次保存相同的信息,我创建了一个仓库表,其中包含地址、名称和id。名称和地址是我运行的导入中列出的名称和地址 现在,数据库中可能存在或不存在与产品相关的其他链接数据 目前我这样做的方式是检查相关条目是否存在,如果不存在,我使用另一个上下文将它们添加到数据库中,并返回新生成实体的id。实际产品将添加到“主”上下文中,并在添加完所有内容后保存。大概是这样的: using (var c

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

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

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

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

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

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
            }
        }
    }
}
void Main()
{
//对象列表
List thelistfmyobjects=newlist();
var dt=新数据表();
添加(“Prop1”,类型(int));
添加(“Prop2”,类型(字符串));
foreach(列表对象中的对象变量)
{
添加(object.Prop1,object.Prop2);
}
InsertWithBulk(dt,“yourconnectionstring”,“MyObject”);
}
私有void InsertWithBulk(DataTable dt、string connectionString、string tableName)
{
使用(SqlConnection destinationConnection=newsqlconnection(connectionString))
{
destinationConnection.Open();
使用(SqlBulkCopy bulkCopy=newsqlbulkcopy(destinationConnection))
{
bulkCopy.DestinationTableName=表名;
尝试
{
bulkCopy.WriteToServer(dt);
}
捕获(例外情况除外)
{
//批量复制中的异常
}
}
}
}

你能给出“CheckWarehouse”和“CreateEntityFromProduct”的代码吗?@bobblez:如果你认为答案是好的,记得投赞成票。它给了我们所有人温暖模糊的感觉,尽管答案并没有涵盖“相互关联”的部分。但我想我只需要做多个插入,从没有外键的表开始,然后朝着依赖性更强的表进行插入。但是有一个问题,我可以通过更改DestinationTableName-属性,使用单个SqlBulkCopy实例将多个批插入到不同的表中,还是每次都创建一个新实例?