Сначала отключите отслеживание в модели структуры объекта - PullRequest
23 голосов
/ 09 августа 2011

Я пытаюсь получить объект, а затем обновить его, но я хочу получить его без отслеживания, чтобы я мог прикрепить его обратно к контексту.

У меня есть ссылка EntityFramework.dll (4.1). Я создал базу данных из модели. (не сначала код).

Получить пользователя:

db.Users.MergeOption = MergeOption.NoTracking;
IQueryable<User> query = db.Users;//.AsNoTracking(); //<-- apparently, this is code-first only.

return query;

Обновление пользователя:

db.Users.Attach(user); //error here.
ObjectStateEntry entry = db.ObjectStateManager.GetObjectStateEntry(user);
entry.SetModifiedProperty(propertyName);
db.SaveChanges();
return user;

Ошибка:

Объект с таким же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом.

Я называю метод так:

var user = userRepository.GetUsers().FirstOrDefault(u => u.UserId == userId);
user.Identifiers.Add(someIdent);
userRepository.UpdateUser(user);

Ответы [ 2 ]

17 голосов
/ 23 сентября 2011

Запросы без отслеживания Иногда вам может потребоваться запросить объекты, но объекты не будут отслеживаться контекстом.Это может привести к повышению производительности при запросе большого количества объектов в сценариях только для чтения.Метод расширения AsNoTracking выполняет запрос и возвращает результаты, не отслеживая их в контексте.В следующем примере запросы будут возвращать объекты, но они не будут отслеживаться контекстом.другое

       // Query for all departments without tracking them
       var departments1 = context.Departments.AsNoTracking().ToList();

      // Query for some departments without tracking them
      var departments2 = context.Departments
                .Where(d => d.Name.StartsWith("math"))
                .AsNoTracking()
                .ToList();
7 голосов
/ 14 сентября 2011

Вместо отсоединения и прикрепления.Если вы хотите обработать Обновление элемента, который может или не может быть из исходного контекста, вы можете сделать следующее.

var originalItem = db.Users.Find(user.UserId);
db.Entry(originalItem).CurrentValues.SetValues(user);
db.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...