【问题标题】:Using Breeze with a static instance of the EFContextProvider将 Breeze 与 EFContextProvider 的静态实例一起使用
【发布时间】:2014-08-08 17:28:06
【问题描述】:

我正在开发一个使用 Breeze 和 Entity Framework 6 以及工作单元和存储库模式的应用程序。目前,我们正在探索在应用程序中使用静态 UnitOfWork 实例的可能性。我已经在我们的控制器中设置了这个:

public class BreezeController : ApiController
{
    private static readonly UnitOfWork _unit = new UnitOfWork();
    ...
    [HttpPost]
    public SaveResult SaveChanges(JObject saveBundle)
    {
        return _unit.SaveChanges(saveBundle);
    }
}

这里,UnitOfWork 类包含 EFContextProvider:

public class UnitOfWork
{
    private readonly EFContextProvider<MyContext> _contextProvider = new EFContextProvider<MyContext>();
    ...
    public SaveResult SaveChanges(JObject saveBundle)
    {
        return _contextProvider.SaveChanges(saveBundle);
    }
}

在查询数据库和将新实体保存到数据库时,这似乎工作正常。但是,在前端第一次调用 saveChanges() 后,对数据库的任何后续查询都失败并出现错误:“Value cannot be null. Parameter name: connection”。我做了一些挖掘,似乎一旦 SaveChanges 完成,与数据库的连接就会重置(例如,ContextProvider 中的 EntityConnection.ConnectionString 设置为空字符串)。我认为这是导致错误的原因(当然,当不使用静态 UnitOfWork 时这不是问题,因为在这种情况下将为下一个查询创建一个新的 EFContextProvider 实例)。

假设这是问题所在,有没有办法阻止 EFContextProvider 在调用 SaveChanges 时重置数据库连接?或者有没有办法强制它及时重新建立连接以进行下一个查询?另一方面,是否有某些原因我不应该尝试使用 EFContextProvider 的静态实例?

【问题讨论】:

    标签: breeze entity-framework-6


    【解决方案1】:

    EFContextProvider 不是线程安全的。 EFContextProvider 创建并使用 DbContext 和 DbContext is not thread safe。使用非线程安全对象的最佳方法是确保为每个线程或 Web 应用程序中的每个 HTTP 请求创建一个新实例。这就是对 EFContextProvider 的建议:每次需要时都创建一个。

    UnitOfWork 封装了一个变更集。您应该为您的应用将进行的每组更改创建一个新的 UnitOfWork 实例。

    【讨论】:

    • 我同意。甚至不要将其视为静态上下文。
    【解决方案2】:

    我们遇到了同样的错误,事实证明它是由我们正在更新的表上的触发器引起的。由于我们不再需要触发器,因此我们将其删除并解决了问题,而无需深入了解触发器导致它的原因。这是 UPDATE 的触发器,它正在将记录插入另一个表。我知道这不是您可以全面应用的解决方案,但我想我会分享以防它对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2013-07-09
      • 1970-01-01
      相关资源
      最近更新 更多