插入N个子实体会产生N个查询。子实体的批量插入?

时间:2015-04-25 19:30:29

标签: c# sql-server asp.net-mvc entity-framework

我知道我可以使用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();
            } 

2 个答案:

答案 0 :(得分:0)

  • 您是否了解过您的代码?
  • 它有多慢?
  • 绝对是SaveChanges()

如果速度很慢,最好的选择是:

  1. 插入没有子项的父级并获取ID。
  2. 使用父ID更新所有子对象
  3. 使用SqlBulkCopy
  4. 批量插入所有子实体

    您需要决定是否要进行优化。

    根据我的理解,每个插入都是EF中的单独查询。即使您使用AddRange。

答案 1 :(得分:0)

从该参数中使用Table-Valued Parameter和INSERT ... SELECT。