Entity Framework и Repository. Безопасно ли передавать открытый контекст контроллерам? - PullRequest
0 голосов
/ 21 апреля 2011

В основном у меня есть репозиторий, который контролирует доступ к моей модели EF. Он создает ссылку и затем в зависимости от того, к какому хранилищу обращаются, возвращает запрашиваемую сущность. Прямо сейчас я раскрываю метод Get IQueryable, который будет возвращать сущность непосредственно из живого ObjectContext. Хорошая практика говорит мне, что я должен обернуть любое использование ObjectContext внутри оператора using, чтобы убедиться, что оно правильно расположено, но когда я делаю это из репозитория, я получаю ошибку, что ObjectContext уже был удален к моменту загрузки контроллера. Я удалил использование, и тогда оно работает просто отлично, но я хотел бы знать, как обычно следует подходить к этому. Я хотел бы сохранить возврат IQueryable, поскольку мне может потребоваться выполнить различные команды для него. Какие-либо предложения? Помогает ли EF защитить меня от открытия открытых соединений, если начинают поступать несколько HTTP-запросов?

Ошибки:

public IQueryable<IUser> Get
    {
        get
        {
            using (var context = new DrinkersPassportEntities(_connString))
            {
                return context.Users.AsQueryable();
            }
        }
    }

Работает, но не помогает мне спать по ночам:

public IQueryable<IUser> Get
    {
        get
        {
            var context = new DrinkersPassportEntities(_connString);
            return context.Users.AsQueryable();
        }
    }

В данный момент все, что делает мой контроллер, таково:

    public ViewResult Index( )
    {

        return View(userRepo.Get);
    }

Ответы [ 2 ]

1 голос
/ 21 апреля 2011

Некоторые люди скажут вам, что ваш репозиторий не должен возвращать Queryables .... но я не покупаю это.

Вы действительно хотите убедиться, что вы избавляетесь от ObjectContext, иначе вы можете получить утечку памяти (особенно потому, что она распространяется на все материализованные сущности).

Распространенным решением является использование времени жизни ObjectContext для каждого запроса. Таким образом, сохраните ObjectContext в объекте запроса ASP .NET и обработайте событие HttpApplication.EndRequest, когда вы удаляете ObjectContext.

0 голосов
/ 21 апреля 2011

Конечно, это безопасно.Многие люди заглушают и имеют 2-3 уровня доступа к данным, чтобы убедиться, что ваш код чист.То, как вы получаете свои объекты, зависит от вас, и я думаю, что прагматичность - лучший способ сделать это.Я думаю, что иметь единственный класс Repository / Service для данного типа, чтобы помочь абстрагироваться от повторного использования определенных запросов, замечательно, но нет ничего длинного с представлением контекста непосредственно в контроллере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...