我知道我可以使用AddRange()插入多个实体,它只会一次访问数据库。在我的情况下,我插入一个单独的实体,例如,有15个子实体。在这种情况下,Mini Profiler说我正在进行15次重复查询,这意味着它需要15次数据库访问才能插入子实体。
问题是 - 如何一次性批量插入N个子实体?实体中的数据量非常小(几行文本)。
编辑:对于有类似问题的人!看起来在EF中没有办法这样做。我最终使用SqlBulkCopy,除了你必须手动添加它工作得很好的相关(子)实体。谢谢你们!
//data u want to add to db
var data = someData.ToList();
System.Data.DataTable table = new System.Data.DataTable();
table.Columns.Add("itemID", typeof(int));
table.Columns.Add("Text", typeof(string));
table.Columns.Add("Number", typeof(int));
table.Columns.Add("ParentId", typeof(int));
foreach (var entity in data)
{
DataRow row = table.NewRow();
row["itemID"] = entity.SomeId;
row["Text"] = entity.SomeText;
row["Number"] = entity.SomeNumber;
row["ParentId"] = entity.SomeParentId;
table.Rows.Add(row);
}
using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["AppDbContext"].ConnectionString))
{
cn.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(cn))
{
bulkCopy.DestinationTableName = "SomeInputFields";
bulkCopy.WriteToServer(table);
}
cn.Close();
}
答案 0 :(得分:0)
SaveChanges()
?如果速度很慢,最好的选择是:
您需要决定是否要进行优化。
根据我的理解,每个插入都是EF中的单独查询。即使您使用AddRange。
答案 1 :(得分:0)
从该参数中使用Table-Valued Parameter和INSERT ... SELECT。