【问题标题】:EntityFramework. Remove all rows then add new. Async实体框架。删除所有行,然后添加新行。异步
【发布时间】:2015-06-25 09:26:49
【问题描述】:

我正在通过 ASP.NET MVC 应用程序将 CSV 导入 SQL 数据库。

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

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

我的问题是调用ExecuteSqlCommandAsync 是否安全,而不是在我调用await db.SaveChangesAsync(); 之前等待结果,如下所示:

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

或者我应该在进行保存更改调用之前await 删除调用?在这种情况下,我还不如调用非异步版本?

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

【问题讨论】:

    标签: c# asp.net sql-server entity-framework asynchronous


    【解决方案1】:

    根据MSDN

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

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

    我想我更愿意显式地等待删除调用(或不将其称为异步),因为您可能想要响应它引发的任何错误(例如不执行保存操作而是写入日志)。

    旁注:考虑使用TRUNCATE TABLE

    【讨论】:

      【解决方案2】:

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

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

      也缺少错误处理。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-19
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多