在实体框架中处置对象上下文4

hoa*_*key 10 c# idisposable repository-pattern entity-framework-4

我有一个实体类,它是从我的数据库模型自动生成的.这个类继承了ObjectContext,它继承了IDisposable.

我创建了一个存储库,其中包含各种方法,这些方法使用实体对象的单个实例与数据库进行交互.

自动生成的类

public partial class DevEntities : ObjectContext
{
    public const string ConnectionString = "name=DevEntities";
    public const string ContainerName = "DevEntities";
Run Code Online (Sandbox Code Playgroud)

存储库类

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;
    }
Run Code Online (Sandbox Code Playgroud)

从中您可以看到我对db实例进行了多次引用.我的问题是,我最好在每个方法中实例化一个新的DevEntity,从而能够实现using语句,从而确保正确处理,或者我当前的实现是否正常?

Fem*_*ref 9

我也会IDisposable在Repository类上实现,所以它可以处理它ObjectContext.如果每次都返回一个不同的ObjectContext,那么在这些对象之间进行查询时会遇到问题,因为这些对象会附加到不同的ObjectContexts,这将导致异常.

定义:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

using(Repository r = new Repository())
{
  //do stuff with your repository
}
Run Code Online (Sandbox Code Playgroud)

这样做,您的存储库会ObjectContext在您使用它之后处理它.