关于如何在Entity Framework 4中处理数据内容,是否有任何"最佳实践"?
目前,我正在每个窗口中执行类似操作:
public class MyWindow()
{
MyEntities() _entities;
MyWindow()
{
_entities = new MyEntities();
InitializeComponent();
}
}
然后加载到这样的数据网格中:
myGrid.ItemsSource= _entities.MyTable;
这并不是很聪明,因为ErrorHandling在这方面是不可能的。
我宁愿选择一个连接类,并做这样的事情:
public class MyData()
{
public IQueryable<Product> GetAllProducts()
{
using(MyContext context = new MyContext())
{
return context.Products;
}
}
}
但首先,这会在每个时间创建一个新的上下文实例,这不是很糟糕吗?
还是应该在连接类中处理全局静态DataContext?这个静态变量不是过载了吗?
public class MyData()
{
private static MyContext Context = new MyContext();
public IQueryable<Product> GetAllProducts()
{
return Context.Products;
}
}
在实体框架中,ObjectContext
/DbContext
是一个工作单元,它们的寿命很短。
拥有一个静态上下文是绝对不可以的,因为这将使用大量内存来跟踪更改实体(每个被跟踪的更改实体都将被缓存和存储,直到上下文被处理为止)。
将上下文封装在using中,就像您的"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
(如我的示例所示)。如果不这样做,则意味着在使用结果时,延迟执行将尝试使用已处理的上下文,这将在运行时导致异常。