2015-06-25 38 views
4

我正在通过ASP.NET MVC应用程序将CSV导入到SQL数据库中。EntityFramework。删除所有行然后添加新的。异步

我遍历CSV中的所有行,为每个行创建一个等效实体并将其添加到当前上下文中。

如果至少有一行要添加,那么我想从正在写入的表中删除所有现有的行,然后提交新的实体。

我的问题是,它是否是安全的呼吁ExecuteSqlCommandAsync,而不是等待结果之前,我随后致电await db.SaveChangesAsync();像这样:

db.Database.ExecuteSqlCommandAsync("delete from tblName"); 
await db.SaveChangesAsync(); 

或者我应该await删除通话之前,我做了保存更改打电话?在这种情况下,我可能会调用非异步版本?

我目前没有在等待它,并且一切似乎都按照预期在本地工作(实际上没有延迟),即现有数据正在被删除并添加了新数据。我担心的是,在解决方案部署时是否还有其他问题需要考虑,Web服务器和SQL服务器不一定在同一个盒子上。

回答

1

MSDN

默认情况下,DELETE语句总是获取关于它修改表的排它(X)锁,并持有该锁直到事务完成。

这意味着保存操作将等待直到删除操作完成,即使后者已启动异步。所以,由于您等待保存呼叫,实际上您还在等待删除呼叫。

我想我宁愿显式等待删除调用(或不要调用它的异步),因为你可能想要回应它引发的任何错误(如不执行保存操作,而是写入日志)。

附注:考虑使用TRUNCATE TABLE

1

EF不支持同一对象的并发使用。这不安全。现在有多个线程写入相同的EF对象,除非另有说明,否则这些线程不安全。

即使这对EF来说是安全的,也不能保证在保存开始时删除甚至开始。

错误处理也丢失。

我不明白你为什么要这样做。这提供了什么好处?当然没有更多的吞吐量。延迟也不会减少,因为删除必须在保存开始前完成。

相关问题