是否有关于如何在Entity Framework 4中处理Datacontext的“最佳实践”?
目前,我正在每个窗口中执行类似的操作:
public class MyWindow()
{
MyEntities() _entities;
MyWindow()
{
_entities = new MyEntities();
InitializeComponent();
}
}
然后加载到这样的数据网格中:
myGrid.ItemsSource= _entities.MyTable;
这并不是很聪明,因为ErrorHandling就不可能了。
我宁愿选择Connection-Class并做类似的事情:
public class MyData()
{
public IQueryable<Product> GetAllProducts()
{
using(MyContext context = new MyContext())
{
return context.Products;
}
}
}
但首先,这会创建一个新的上下文实例每时间 - 这不是很糟糕吗?
或者我应该在Connection-Class中处理全局静态DataContext?不会让这个静态变量超载吗?
public class MyData()
{
private static MyContext Context = new MyContext();
public IQueryable<Product> GetAllProducts()
{
return Context.Products;
}
}
答案 0 :(得分:2)
在实体框架中,ObjectContext
/ DbContext
是一个工作单元,它们的生命周期很短。
拥有静态上下文是一个明确的禁忌,因为这将使用大量内存和更改跟踪实体(每个更改跟踪的实体都将被缓存并存储,直到上下文被释放)。
在使用中包装上下文,就像你的'Connection-Class'示例一样,这是正确的方法。这通常被称为服务。
示例服务:
public class ProductService
{
public IEnumerable<Product> GetAllProducts()
{
using(MyContext context = new MyContext())
{
foreach(var product in context.Products)
yield return product;
}
}
}
在将要处理上下文的块中返回结果集合时,请务必调用ToArray()
或ToList()
或使用yield return
(如我的示例所示)。如果不这样做,则意味着在使用结果时,延迟执行将尝试使用已处置的上下文,这将在运行时导致异常。