我使用EF6.1与MVC3和ASP.NET 4.5与SQL Server 2008 SP2(开发)和Azure SQL(测试,实时)
我正在尝试加快DML性能,我发现EF中的AddObject方法很慢。不确定是跟踪是原因,我应该以某种方式改变这一点,但目前我采用更直接的方法:
db.ExecuteStoreCommand("INSERT INTO Order ([SupplierId]) Values ({0})", SupplierId);
但是,如何在提交数据库后获取新生成的PK值。在DB中,它是一个整数Identity列。任何这些直接DB方法都可以返回一个新的PK值,例如" AddObject"在" SaveChanges()"之后呢?如果另一个用户同时插入同一个表,我也非常注意获取错误记录的问题。
唯一可行的解决方法是使用Insert存储Guid,然后执行:
var myOrder = db.Order.First(r=>r.Guid==myGuid);
int myId = myOrder.Id;
提前致谢。
修改
当我在SQL Azure上使用这个ExecuteStoreCommand / Select by Guid方法时,我将插入事务时间从300毫秒减少到60毫秒,因此它很重要。
顺便说一句,在同一台机器上有SQL Server的本地开发服务器上,未经改进的代码需要90毫秒而不是300毫秒。因此,Azure中的网络延迟似乎正在惩罚" AddObject"接近更严厉。