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 только на то время, которое вам действительно нужно.Обычно это время, когда вы обычно блокируете базу данных, или время, в течение которого вы поддерживаете транзакцию.