在Entity Framework 4中处理对象上下文的释放问题

10
我有一个实体类,它是从我的数据库模型自动生成的。这个类继承了 ObjectContext,而 ObjectContext 又继承了 IDisposable。
我创建了一个仓储(repository),其中包含各种方法,这些方法使用实体对象的单个实例与数据库进行交互。
自动生成的类。
public partial class DevEntities : ObjectContext
{
    public const string ConnectionString = "name=DevEntities";
    public const string ContainerName = "DevEntities";

存储库类

DevEntities db = new DevEntities();

        public Customer GetCustomerByID(int id)
    {
        var customers = db.Customers.FirstOrDefault(c => c.CustomerId == id);

        return customers;
    }

    public Customer GetCustomerByPasswordUsername(string email, string password)
    {
        var customers = db.Customers.FirstOrDefault(c => c.Email == email && c.Password == password);

        return customers;
    }

从这里您可以看到我对数据库实例做了多次引用。我的问题是,我最好在每个方法中实例化一个新的DevEntity,这样就能实现使用语句,确保正确的处理,还是我目前的实现方式可以?

1个回答

9
我会在Repository类上实现IDisposable接口,以便可以释放ObjectContext。如果每次返回不同的ObjectContext,则在这些对象之间进行查询时可能会遇到问题,因为它们附加到不同的ObjectContext,这将导致异常。
定义:
public class Repository : IDisposable
{
    DevEntities db = new DevEntities();

    public Customer GetCustomerByID(int id)
    {
        var customers = db.Customers.FirstOrDefault(c => c.CustomerId == id);

        return customers;
    }

    public Customer GetCustomerByPasswordUsername(string email, string password)
    {
        var customers = db.Customers.FirstOrDefault(c => c.Email == email && c.Password == password);

        return customers;
    }

    public void Dispose()
    {
        db.Dispose();
    }
}

使用方法:

using(Repository r = new Repository())
{
  //do stuff with your repository
}

这样做,您的存储库会在使用完ObjectContext后进行处理。

如果我这样做,我需要覆盖IDisposable的dispose方法,是吗?那会是什么样子呢?它会处理对象并且每个方法都会引用该方法,从而处理它们的实例吗? - hoakey
不,你不需要覆盖它,你只需在你的存储库上实现接口;现在你可以在 using 语句中使用该存储库,这样类就会在使用结束时自动释放。 - Femaref
抱歉我的理解能力有限,我还不太明白那会是如何运作的。您能否再详细解释一下呢?非常感谢。 - hoakey
1
当您启用了延迟加载时,如何将其包装在using语句中? - Praveen
当然,如果您直接使用ObjectContext,您也不能离开使用它并期望能够访问其余数据。 - Femaref
当使用“using语句”时,我如何在编写单元测试时模拟Repository类?我希望我的单元测试不会实际使用DevEntities()对象。 - Mitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接