Как мне обновить объекты Entity Framework, не изменяя все экземпляры этого объекта?

StackOverflow https://stackoverflow.com/questions/7810989

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top