Как правильно расположить объекты (ASP.NET MVC + Entity Framework) - PullRequest
2 голосов
/ 03 февраля 2012

Я хотел бы знать, как правильно расположить объекты в следующей ситуации. Это действие контроллера ASP.NET MVC. Есть репозиторий, который реализует IDisposable. Объект вложения содержит связанный объект Task. Когда я нажимаю на детали вложения, они отображаются правильно. Но когда я нажимаю на задачу, появляется следующее исключение «Экземпляр ObjectContext был удален ...». Я понимаю, что когда представление отображается, оно удаляется, а ObjectContext закрывается.

public ActionResult Detail(Guid id)
{
    Attachment attachment = null; 
    using (var attachmentRepository = IoC.Resolve<AttachmentRepository>())
    {
        attachment = attachmentRepository.SelectByKey(id);
        return View("Detail", attachment);            
    }          
}    

Мой вопрос: что является лучшей практикой в ​​этом сценарии?

Это хорошее решение? Когда ObjectContext будет расположен в этой ситуации? Когда пользователь перейдет в другой вид? Или когда будет запущен сборщик мусора?

public ActionResult Detail(Guid id)
{
    Attachment attachment = null; 
    var attachmentRepository = IoC.Resolve<AttachmentRepository>();

    attachment = attachmentRepository.SelectByKey(id);
    return View("Detail", attachment);                              
}    

спасибо

1 Ответ

2 голосов
/ 03 февраля 2012

Ваша сущность Task не была получена как часть вашего исходного запроса, поэтому EF пытается выполнить ее отложенную загрузку, которая завершается неудачно, так как контекст был удален.Вы должны использовать запрос Include() для извлечения сущности Task как часть вашего исходного запроса, чтобы избежать необходимости позже возвращаться к базе данных (что также будет означать, что вам придется поддерживать живой контекст).*

Кроме того, здесь вы на самом деле не выполняете IoC, вы используете шаблон Service Locator (Anti-) .Ваш контейнер IoC должен передаваться в ваш репозиторий как зависимость конструктора от вашего контроллера.Контейнер IoC, в свою очередь, должен отвечать за управление временем жизни ваших экземпляров репозитория.

...