Entity Framework Эффективное отделение большой коллекции объектов и устранение. Экземпляр ObjectContext был удален, и больше не может быть - PullRequest
0 голосов
/ 24 мая 2018

Наша компания имеет программное приложение, которое использует

-Entity Framework 4

-Код Первый подход

enter image description here

В нашем коде уровня доступа к данным у нас есть экземпляры контекста нашей базы данных Entity Framework:

public class DataAccessLayer
{
    protected DbContext _context;
    public List<Task> GetSpecificProjectTasks(int projectIdInQuestion)
    {
        _context.Configuration.LazyLoadingEnabled = false;
        List<Task> taskList =
            (from tsk in _context.Tasks
             join prj in _context.Projects on prj.ID_Project 
             equals tsk.ParentID_Project
             select tsk).ToList();

        _context.Configuration.LazyLoadingEnabled = true;
        return taskList;
    }
}

Теперь предположим, что некоторый клиентский код выполняет следующие действия:

List<Task> crazyTaskList = null;

using (DataAccessLayer dal = new DataAccessLayer())
{
    crazyTaskList  = dal.GetSpecificProjectTasks(5);
}

foreach (Task tsk in crazyTaskList)
{

}

Код клиентаforeach цикл выдает ошибку, потому что crazyTaskList равен null, и это дает мне ошибку The ObjectContext instance has been disposed can can no longer be used for operations that require a connection.Почему это все еще null?Я уже временно отключил ленивую загрузку, так почему же это null?Более того, если мне придется отсоединить огромный список, содержащий много объектов типа Task, было бы действительно неэффективно написать какой-то цикл, подобный следующему:

public List<Task> GetSpecificProjectTasks(int projectIdInQuestion)
{ 
    _context.Configuration.LazyLoadingEnabled = false;
    List<Task> taskList =
        (from tsk in _context.Tasks join prj in _context.Projects
        on prj.ID_Project equals tsk.ParentID_Project 
        select tsk).ToList();

    // The following loop is inefficent
    for(int i = 0; i < taskList.Count(); i++)
    {
        dbContext.Entry(taskList[i]).State = EntityState.Detached;
    }

    _context.Configuration.LazyLoadingEnabled = true;
    return taskList;
}

1 Ответ

0 голосов
/ 25 мая 2018

Лучшей идеей является использование моделей POCO для хранения информации.

List<Task> taskList =
        (from tsk in _context.Tasks join prj in _context.Projects
        on prj.ID_Project equals tsk.ParentID_Project 
        select new TaskPOCO{ParentID_Project = tsk.ParentID_Project,....}).ToList();

Гораздо более простым способом является использование для загрузки всех данных при первоначальном запросе

using     List<Task> taskList =
        (from tsk in _context.Tasks join prj in _context.Projects
        on prj.ID_Project equals tsk.ParentID_Project 
        select tsk).Include(t=>t.NavigationProperty).ToList();
...