Entity Framework - Использование оператора с отложенным выполнением в репозитории - PullRequest
1 голос
/ 20 июля 2011

Я создал простой класс репозитория, который возвращает список проектов:

public class ProjectRepository : IProjectRepository
{
    public IQueryable<Project> GetProjects() 
    {
        DbEntities db = new DbEntities();

        return db.Projects;
    }
}

У меня есть код, который позже работает над этим IQueryable, чтобы выполнить некоторую сортировку / разбиение по страницам:

public ActionResult Index()
{
    var projectList = (from p in projectRepository.GetProjects()
                      orderby p.Name
                      select p).Take(20);

    return View(projectList.ToList());
}

Я изначально обернул свой вызов GetProjects () в оператор использования по привычке - так как обычно хорошей идеей является удаление ваших объектов как можно скорее.Понятно, что это вызвало проблемы, потому что я выполнял какую-то дальнейшую работу с базой данных в своем действии контроллера.

Можно ли просто разрешить удаление объекта, когда он является сборщиком мусора?Есть ли лучший способ сделать это вместо этого?Должен ли я создавать более целенаправленные методы репозитория, такие как:

public IQueryable<Project> GetProjects(int takeThisMany)
{
    return (from p in db.Projects
           orderby p.Name
           select p).Take(takeThisMany);
}

Это хорошая или плохая практика - возвращать объекты IQueryable, которые будут выполнены позже в действии контроллера, без удаления исходного контекста или нет?

1 Ответ

2 голосов
/ 20 июля 2011

Можно вернуть IQueryable<T>, но неправильно либо не распоряжаться ObjectContext (вы всегда должны распоряжаться IDisposable), либо распоряжаться им до завершения запроса.

Используйте конструктор для передачи контекста в репозиторий и утилизации его в конце запроса.

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