处理EntityFramework 4.0中的DataContext

本文关键字:中的 DataContext EntityFramework 处理 | 更新日期: 2023-09-27 18:22:51

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

处理EntityFramework 4.0中的DataContext

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