我不知道是否有更好的方法来使用 DbContext
,因为在使用 WCF 时不建议将其设置为静态。因此,每次访问数据库时我们都需要创建它。
了解使用 Entity Framework 的所有优点后,有些优点变得无用了,因为我们每次都重新创建了 DbContext
;而且更多的可能会导致开销,因为要考虑创建大型实体模型的过程。
你有什么看法?
我不知道是否有更好的方法来使用 DbContext
,因为在使用 WCF 时不建议将其设置为静态。因此,每次访问数据库时我们都需要创建它。
了解使用 Entity Framework 的所有优点后,有些优点变得无用了,因为我们每次都重新创建了 DbContext
;而且更多的可能会导致开销,因为要考虑创建大型实体模型的过程。
你有什么看法?
您是正确的,通常不建议使用单个静态实例的 DbContext
:
您使用 ObjectContext 的次数越多,它就会变得越大。 这是因为它持有对其曾经知道的所有实体的引用,基本上是您查询、添加或附加的任何内容。 因此,应重新考虑无限期共享同一 ObjectContext。
这些注释直接适用于 DbContext
,因为它包装了 ObjectContext
以公开更简化和直观的 API。[参见文档]
创建上下文的开销相对较低:
实际上,这个成本其实非常低,因为它主要涉及从全局缓存中通过引用复制元数据到新的ObjectContext。一般来说,我认为这个成本不值得担心...
处理短暂上下文的常见方法是将其包装在using块中:
using(DbContext context = new SomeDbContext())
{
// Do work with context
}
为了方便测试,您可能希望让DbContext
实现一些IDbContext
接口,并创建一个工厂类ContextFactory<T> where T : IDbContext
来实例化上下文。
这使您可以轻松地将任何IDbContext
替换到您的代码中(例如,对象模拟的内存上下文)。
public void WCFMethod()
{
using (DBContext db = new DBContext())
{
BusinessLogic logic = new BusinessLogic(db);
logic.DoWork();
}
}
DataContext
仍然跟踪对检索到的“实体”所做的更改,并维护标识缓存,以确保多次检索到的实体使用相同的对象实例表示。它还是轻量级的,创建成本不高。请参阅 http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.aspx。 - RobDataContext
可能是一个不好的主意。从我回答中的文章中可以看出:“如果您有一种自然的有限生命周期方式来管理 ObjectContext,例如短暂的表单、UnitOfWork 或 Repository,则相应地调整 ObjectContext 的范围可能是最好的选择。” - Rob