ef linq方式插入+sql操作数据注意事项

  容易错,便写个博客记一下。

  先看原来的写法:

db.表1.AddRange(temp);
db.Database.ExecuteSqlCommand($@"INSERT INTO dbo.表2 ...此处逻辑省略”);
db.SaveChanges();

  运行后发现数据库没有新增的数据,后发现和执行顺序有关,AddRange只是将表加入到内存,等SaveChange以后才会正式提交入库,而ExecuteSqlCommand是需要表1数据的,这就会导致这一步取不到数,因为还没有提交。

  改完之后的写法:

db.表.AddRange(temp);
db.SaveChanges();
db.Database.ExecuteSqlCommand($@"INSERT INTO dbo.表 ...此处省略”);

  先提交使数据插入到库,再执行了sql命令,sql命令自带提交所以无需再SaveChange。

 

  PS:顺便再提一点:批量插入数据前如果有校验是否非重复再插入,导致插入慢的,可以建个附表,数据全插入到附表,再通过主表 Not Exists 附表来实现批量插入。这种比程序里foreach循环判断速度快。

ef linq方式插入+sql操作数据注意事项

上一篇:MongoDB集群分片管理之哈希分片


下一篇:SparkSQL读取数据加载DataFrame