Устранение объектного контекста в инфраструктуре сущности 4

У меня есть класс сущностей, который автоматически генерируется из моей модели базы данных. Этот класс наследует ObjectContext, который inturn наследует IDisposable.

Я создал репозиторий, который имеет различные методы, которые используют один экземпляр объекта сущности для взаимодействия с базой данных.

Авто сгенерированный класс

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;
    }

Из этого вы можете видеть, что я делаю несколько ссылок на экземпляр db. Мой вопрос: лучше ли создавать экземпляр нового DevEntity в каждом методе, тем самым имея возможность реализовать оператор using и, следовательно, обеспечить правильное удаление или моя текущая реализация в порядке?

Ответ 1

Я бы реализовал IDisposable в классе Repository, поэтому он может распоряжаться ObjectContext. Если вы каждый раз возвращаете другой ObjectContext, вы можете столкнуться с проблемами при выполнении запросов между этими объектами, поскольку они привязаны к различным ObjectContext s, что приведет к исключению.

Определение:

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 после его использования.