Подтвердить что ты не робот

Лучший способ инициализировать контекст фреймворка?

При инициализации контекста инфраструктуры сущности.

Один из них - инициализировать на уровне класса, например

public class EntityContactManagerRepository
    : ContactManager.Models.IContactManagerRepository
{
    private ContactManagerDBEntities _entities = new ContactManagerDBEntities();

    // Contact methods
    public Contact GetContact(int id)
    {
        return (from c in _entities.ContactSet.Include("Group")
                where c.Id == id
                select c).FirstOrDefault();
    }
}

Другим способом является инициализация на уровне метода.

public class EntityContactManagerRepository
    : ContactManager.Models.IContactManagerRepository
{    
    // Contact methods
    public Contact GetContact(int id)
    {
       using (var entities = new ContactManagerDBEntities())
           return (from c in entities.ContactSet.Include("Group")
               where c.Id == id
               select c).FirstOrDefault();
    }
}

Из фона Ado.Net я предпочитаю более поздний метод с одним инициализацией, но первый из приведенного в примере Stephen Walthe. Или другой вопрос, имеет ли это значение вообще?

4b9b3361

Ответ 1

Это имеет значение, поскольку контекст управляет временем жизни данных отслеживания изменений, а также влияет на то, какие экземпляры объектов вы можете связать вместе при редактировании объектов, поскольку объекты в двух разных контекстах не могут иметь отношения друг с другом. Мне кажется, что примеры, которые вы используете, поступают из приложения ASP.NET MVC. В этом случае я обычно использую один сущностный контекст для каждого запроса, так как запросы недолговечны, и поскольку при обновлении объекта в запросе он является обычным, нужно извлекать другие объекты и создавать отношения между ними.

С другой стороны, вы не хотите долго поддерживать контекст сущности, потому что он будет переваривать память, поскольку отслеживает изменения для большего количества объектов.

Это может показаться аргументом для опции "один контекст для каждого класса", но это не так. Это больше похоже на аргумент "один контекст на единицу работы".

Ответ 2

Вообще говоря, это контекст для каждого запроса в ASP.NET и контекст для каждого окна в WinForms/WPF.

Там есть статья, в которой достаточно объясняется аргументация парадигмы контекста для каждого запроса: Контекст контекста объектной структуры Entity Framework

Ответ 3

Ну, "лучший" способ всегда субъективен. Тем не менее, добавление класса UnitOfWorkScope в проект может значительно упростить ситуацию - вам не нужно слишком много думать о создании контекста объекта или о продолжении работы модуля в базе данных.

Существует отличная статья, в которой объясняется Как создать единицу объема работы.