Как обновить объекты Entity Framework без изменения ВСЕХ экземпляров этого объекта? - PullRequest
2 голосов
/ 18 октября 2011

У меня есть этот код, который использует 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?

1 Ответ

1 голос
/ 18 октября 2011

Попробуйте AsNoTracking():

Navigation nav = db.Navigations.AsNoTracking().FirstOrDefault();
List<Navigation> lNav = db.Navigations.AsNoTracking().ToList();

Таким образом, загруженные объекты не присоединяются к контексту, и для первого объекта должны быть созданы два разных экземпляра. Используя AsNoTracking, вы отключаете отображение идентификаторов между значениями ключей сущности и ссылками на объекты, которое отвечает за наблюдаемое вами поведение. (Всегда может быть только одна ссылка на сущность с данным ключом в контексте, и EF не создает новый объект, если вы загружаете сущность с тем же ключом. Вместо этого он возвращает объект, который уже существует в контексте.)

Имейте в виду, что вы не можете использовать это, если намереваетесь обновить сущности с помощью механизма отслеживания изменений EFs. AsNoTracking() предназначен для сценариев только для чтения.

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