2014-11-04 4 views
0

В настоящее время, я реализовал эту функцию обновления в моем Generic Repositoryданные не обновляются после называются .CurrentValues.SetValues ​​

public virtual void Update(TEntity entity) 
    { 
     var dbContext = _context as DbContext; 

     var entry = dbContext.Entry(entity); 
     var key = GetPrimaryKey(entry); 

     if (entry.State == EntityState.Detached) 
     { 
      var currentEntry = _dbSet.Find(key); 
      if (currentEntry != null) 
      { 
       dbContext.Entry(currentEntry).CurrentValues.SetValues(entity); 
       dbContext.Entry(currentEntry).State = EntityState.Modified; 
      } 
      else 
      { 
       _dbSet.Attach(entity); 
       entry.State = EntityState.Modified; 
      } 
     } 
     dbContext.SaveChanges(); 
    } 

Я пытался отладки и обнаружил, что значение «currentEntry» обновляются к тому же как «сущность». Но данные в базе данных не обновляются. Пожалуйста, помогите, если у вас есть решение для этого.

+0

Что вы видите, когда вы контролируете SQL, который выполняется 'SaveChanges'? –

ответ

1

У меня есть простой рабочий вариант метода Update на моем родовом хранилище, посмотреть, если это помогает:

public int Update<T>(T item) where T : class 
    { 
     Guard.ArgumentNotNull(item, "item"); 

     Set<T>().Attach(item); 

     // Calling State on an entity in the Detached state will call DetectChanges() 
     // which is required to force an update. 
     Entry(item).State = EntityState.Modified; 

     return SaveChanges(); 
    } 

И поскольку EF отслеживать объект внутренне, называя этот метод будет бросать исключение «Объект с таким же ключ уже существует в ObjectStateManager ObjectStateManager не может отслеживать несколько объектов с тем же ключом «

я решил его отключение отслеживания объекта в моем методе запроса, как показано ниже:..

public IQueryable<T> Query<T>() where T : class 
    { 
     return Set<T>().AsNoTracking(); 
    } 
+0

Раньше я использовал ваше решение, должно ли оно генерировать исключение «Объект с тем же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом». –

+0

@ conanak99 - Это может быть связано с отслеживанием внутренних объектов. Я установил его в методе Query, используя Set () .AsNoTracking(); см. Мой обновленный ответ. – SBirthare