我需要编写一些代码来插入大约 300 万行数据。
同时我需要插入相同数量的伴随行。
即架构如下所示:
Item
- Id
- Title
Property
- Id
- FK_Item
- Value
我的第一次尝试是这样的:
BaseDataContext db = new BaseDataContext();
foreach (var value in values)
{
Item i = new Item() { Title = value["title"]};
ItemProperty ip = new ItemProperty() { Item = i, Value = value["value"]};
db.Items.InsertOnSubmit(i);
db.ItemProperties.InsertOnSubmit(ip);
}
db.SubmitChanges();
显然这非常慢,所以我现在使用这样的东西:
BaseDataContext db = new BaseDataContext();
DataTable dt = new DataTable("Item");
dt.Columns.Add("Title", typeof(string));
foreach (var value in values)
{
DataRow item = dt.NewRow();
item["Title"] = value["title"];
dt.Rows.Add(item);
}
using (System.Data.SqlClient.SqlBulkCopy sb = new System.Data.SqlClient.SqlBulkCopy(db.Connection.ConnectionString))
{
sb.DestinationTableName = "dbo.Item";
sb.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Title", "Title"));
sb.WriteToServer(dt);
}
但这不允许我添加相应的“属性”行。
我认为最好的解决方案可能是添加一个像这样的存储过程,它通常可以让我进行批量插入(或至少多次插入,但我可能会以某种方式禁用登录存储过程以提高性能),然后返回对应的id。
谁能想到更好的(即更简洁,性能几乎相同)的解决方案?