Как мне обновить объекты Entity Framework, не изменяя все экземпляры этого объекта?
-
26-10-2019 - |
Вопрос
У меня есть этот код, который использует Entity Framework 4.1 для доступа к объектам базы данных:
public string Test()
{
Navigation nav = db.Navigations.FirstOrDefault();
List<Navigation> lNav = db.Navigations.ToList();
foreach (var item in lNav)
{
item.Label += " [Edited]";
}
return nav.Label;
}
Когда я запускаю это в ASP.NET MVC, он возвращает это:
News [Edited]
Я ожидал, что он вернется:
News
Потому что я думал, что мой foreach
будет только изменять содержимое lNav
. Анкет Вместо этого он, кажется, изменяет все экземпляры объектов объекта.
Как я могу изменить lNav
без модификации nav
?
Решение
Пытаться AsNoTracking()
:
Navigation nav = db.Navigations.AsNoTracking().FirstOrDefault();
List<Navigation> lNav = db.Navigations.AsNoTracking().ToList();
Таким образом, загруженные объекты не привязаны к контексту, и для первой сущности должны быть созданы два разных экземпляра. Используя AsNoTracking
Вы отключите отображение идентификации между ключевыми значениями объекта и ссылками на объекты, которые отвечают за поведение, которое вы наблюдали. (В контексте всегда может быть только одна ссылка на объект с данным ключом, и EF не создает новый объект, если вы загружаете объект с одним и тем же ключом. Вместо этого он возвращает объект, который уже существует в контексте.)
Имейте в виду, что вы не можете использовать это, если вы намерены обновить сущности с помощью механизма отслеживания EFS. AsNoTracking()
предназначен для сценариев Readonly.