Сначала отключите отслеживание в модели фреймворка сущности

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

У меня есть ] Ссылка на 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);
23
задан marc_s 13 July 2015 в 07:15
поделиться

2 ответа

Запросы без отслеживания Иногда вам может потребоваться запросить объекты, но объекты не будут отслеживаться контекстом. Это может привести к повышению производительности при запросе большого количества объектов в сценариях только для чтения. Метод расширения 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();
18
ответ дан 29 November 2019 в 02:48
поделиться

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

var originalItem = db.Users.Find(user.UserId);
db.Entry(originalItem).CurrentValues.SetValues(user);
db.SaveChanges();
7
ответ дан 29 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: