处理EntityFramework 4.0中的DataContext

时间:2012-02-06 14:39:37

标签: c# entity-framework data-access

是否有关于如何在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;
    }
}

1 个答案:

答案 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(如我的示例所示)。如果不这样做,则意味着在使用结果时,延迟执行将尝试使用已处置的上下文,这将在运行时导致异常。