Выполнение нескольких запросов выбора с использованием одного и того же контекста БД - PullRequest
0 голосов
/ 01 декабря 2018

Можете ли вы выполнить несколько запросов "select", используя один и тот же контекст данных?Сегодня на работе я столкнулся с ситуацией, когда запрос возвращает неточные результаты, когда я запускаю несколько запросов «select» в одном и том же контексте с помощью Entity Framework 4. Код похож на приведенный ниже:

            using(var dataContext = new VisitorDataContext())
            {
                var v1 = dataContext.Visitor.Where(p => p.VisitorId == 73).FirstOrDefault();

//process v1
                var v2 = dataContext.Visitor.Where(p => p.VisitorId == 98).FirstOrDefault();

//process v2 
                var v3 = dataContext.Visitor.Where(p => p.VisitorId == 100).FirstOrDefault();

//provess v2
            }

Так что со мной произошло то, что версия 2 содержала предыдущие результаты версии 1.Я подозреваю, что это потому, что контекст не удаляется до конца этого использования блока.Мне интересно, если в будущем, чтобы избежать этой ошибки, я должен располагать контекст после каждого запроса.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

DbContext запоминает элементы, которые вы уже выбрали.Это необходимо, чтобы иметь возможность изменять извлеченные данные перед сохранением.

Пример. Предположим, у вас есть школа со многими учителями и многими учениками;каждый учитель имеет ноль или более учеников, каждый учитель имеет ноль или более учителей (отношение «многие ко многим»)

Предположим, ученика [100] зовут Тереза ​​и он живет в «DowningStreet 10, London». Она переезжает.Тем временем вы хотите уведомить всех других учеников, которые живут поблизости, о ее новом адресе:

var TheresaMay = dbContext.Students.
    .Where(student => student.Id == 100)
    .FirstOrDefault();

// change address of TheresaMay:
theresaMay.Address = "King's College, Oxford",

Данные еще не сохранены, в базе данных она все еще живет в Лондоне.Если бы вы использовали это значение, что бы вы хотели?Измененное значение или значение базы данных:

var city = theresaMay.City; // London or Oxford?

Сообщите всем ближайшим студентам о своем новом адресе

var nearbyStudents = dbContext.Students
    .Where(student => student.City == theresaMay.City)
    .ToList();
SendMessage(nearbyStudents)

Хотите, чтобы оксфордские студенты получили уведомление, или вы хотели бы, чтобы лондонские студенты?

Предположим, вы хотите выбрать студентов, сгруппированных по городам:

var studentsGroupedByCitry = dbContext.Students
    .GroupBy(student => student.City)
    .ToList();

Вопрос: Тереза ​​должна быть в группе лондонских студентов или в оксфордских студентах?

ДизайнерыВ рамках Entity Framework считалось разумным, что после того, как вы получите TheresaMay и измените свойство, для вас значением этого свойства будет новое значение, а не значение, которое все еще находится в базе данных.

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

Поэтому немного опасно держать ваш контекст открытым для запроса нескольких элементов, потому что если кто-то ещеизменяет один из элементов, которые вы уже выбрали, вы не увидите эти изменения.Следовательно, разумно хранить dbContext только на то время, которое вам действительно нужно.Обычно это время, когда вы обычно блокируете базу данных, или время, в течение которого вы поддерживаете транзакцию.

0 голосов
/ 01 декабря 2018

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

Но это не повлияет на код, такой как вы опубликовали.Также вы должны использовать EF 6, а не EF 4.

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