C# 实体框架。删除所有行,然后添加新行。异步的

C# 实体框架。删除所有行,然后添加新行。异步的,c#,asp.net,sql-server,entity-framework,asynchronous,C#,Asp.net,Sql Server,Entity Framework,Asynchronous,我正在通过ASP.NET MVC应用程序将CSV导入SQL db 我正在迭代CSV中的所有行,为每个行创建一个等效实体,并将每个行添加到当前上下文中 如果至少有一行要添加,那么我希望从要写入的表中删除所有现有行,然后提交新实体 我的问题是调用ExecuteSqlCommandAsync而不是在调用await db.SaveChangesAsync()之前等待结果是否安全像这样: db.Database.ExecuteSqlCommandAsync("delete from tblName");

我正在通过ASP.NET MVC应用程序将CSV导入SQL db

我正在迭代CSV中的所有行,为每个行创建一个等效实体,并将每个行添加到当前上下文中

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

我的问题是调用
ExecuteSqlCommandAsync
而不是在调用
await db.SaveChangesAsync()之前等待结果是否安全像这样:

db.Database.ExecuteSqlCommandAsync("delete from tblName");
await db.SaveChangesAsync();
或者我应该在调用save changes之前等待删除调用吗?在这种情况下,我还可以调用非异步版本

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

< P>:

默认情况下,DELETE语句总是在其修改的表上获取一个独占(X)锁,并将该锁保持到事务完成为止

这意味着保存操作将等待删除操作完成,即使后者是异步启动的。因此,既然您在等待save调用,实际上您也在等待delete调用

我认为我更愿意显式地等待delete调用(或者不将其称为async),因为您可能希望响应它引发的任何错误(比如不执行save操作,而是编写日志)


边注:考虑使用<代码>截断表。

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

即使这在EF中是安全的,也不能保证在保存开始时删除已经开始

错误处理也丢失了

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