将Breeze与EFContextProvider的静态实例一起使用

时间:2014-08-08 17:28:06

标签: breeze entity-framework-6

我正在开发一个使用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()之后,对数据库的任何后续查询都会失败并显示错误:&#34; Value不能为null。参数名称:connection&#34;。我做了一点挖掘,看起来一旦SaveChanges完成就重置与数据库的连接(例如,ContextProvider中的EntityConnection.ConnectionString被设置为空字符串)。我认为这是导致错误的原因(当然,这不是使用静态UnitOfWork时的问题,因为在这种情况下将为下一个查询创建新的EFContextProvider实例)。

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我们得到了同样的错误,结果发现它是由我们正在更新的表上的触发器引起的。由于我们不再需要触发器,我们将其删除并解决了问题,而没有深入了解触发器导致它的原因。它是UPDATE的触发器,它将记录插入到另一个表中。我知道这不是一个你可以全面申请的解决方案,但我想我会分享以防万一。