我正在通过ASP.NET MVC应用程序将CSV导入到SQL数据库中.
我正在迭代CSV中的所有行,为每个行创建一个等效实体,并将每个行添加到当前上下文中.
如果要添加至少一行,那么我想从正在写入的表中删除所有现有行,然后提交新实体.
我的问题是在调用await db.SaveChangesAsync()之前调用ExecuteSqlCommandAsync是否安全,而不是等待结果.像这样:
db.Database.ExecuteSqlCommandAsync("delete from tblName");
await db.SaveChangesAsync();
或者我应该在进行保存更改调用之前等待删除调用?在这种情况下,我也可以调用非异步版本?
我目前没有等待它,一切似乎都按预期在本地工作(几乎没有延迟),即现有数据被删除,新数据被添加.我担心的是,在部署解决方案时,我是否应该考虑其他事项,并且Web服务器和SQL服务器不一定在同一个盒子上.
最佳答案 按照
MSDN:
By default, a DELETE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes.
这意味着保存操作将等待删除操作完成,即使后者启动为异步.因此,既然等待保存呼叫,实际上您还等待删除呼叫.
我想我更愿意明确地等待删除调用(或者不要将其称为异步),因为你可能想要响应它引发的任何错误(比如不执行保存操作,而是编写日志).
附注:考虑使用TRUNCATE TABLE.