Удаление контекста объекта в рамках сущности 4 - PullRequest
10 голосов
/ 02 января 2011

У меня есть класс сущностей, который автоматически генерируется из моей модели базы данных.Этот класс наследует 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 Ответ

9 голосов
/ 02 января 2011

Я бы также реализовал 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 после его использования.

...