RIA Services Repository Save не работает? - PullRequest
2 голосов
/ 22 марта 2010

Выполняя свое первое приложение на базе SL4 MVVM RIA, я столкнулся со следующей ситуацией: обновление записи (EF4, NO-POCOS !!) в SL-клиенте, по-видимому, имеет место, но значения в dbms неизменны. Отладка с Fiddler сообщение о сохранении (среди прочего):

EntityActions.nil b9 http://schemas.microsoft.com/2003/10/Serialization/Arrays^HasMemberChanges�^Id�^ Операция Обновление

Я предполагаю, что это говорит только: эй! DBMS должен сделать обновление этой записи, и ничего больше! Это правильно?!

Я использую общий репозиторий, подобный этому:

public class Repository<T> : IRepository<T> where T : class
    {
        IObjectSet<T> _objectSet;
        IObjectContext _objectContext;

        public Repository(IObjectContext objectContext)
        {
            this._objectContext = objectContext;
            _objectSet = objectContext.CreateObjectSet<T>();
        }

        public IQueryable<T> AsQueryable()
        {
            return _objectSet;
        }
        public IEnumerable<T> GetAll()
        {
            return _objectSet.ToList();
        }
        public IEnumerable<T> Find(Expression<Func<T, bool>> where)
        {
            return _objectSet.Where(where);
        }
        public T Single(Expression<Func<T, bool>> where)
        {
            return _objectSet.Single(where);
        }
        public T First(Expression<Func<T, bool>> where)
        {
            return _objectSet.First(where);
        }
        public void Delete(T entity)
        {
            _objectSet.DeleteObject(entity);
        }
        public void Add(T entity)
        {
            _objectSet.AddObject(entity);
        }
        public void Attach(T entity)
        {
            _objectSet.Attach(entity);     
        }

        public void Save()
        {           
            _objectContext.SaveChanges();
        }
    }

Метод обновления DomainService является следующим:

[Update]
        public void UpdateCulture(Culture currentCulture)
        {
            if (currentCulture.EntityState == System.Data.EntityState.Detached)
            {
                this.cultureRepository.Attach(currentCulture);
            }
            this.cultureRepository.Save();
        }

Я знаю, что текущий объект-культура отключен. Что меня смущает (среди прочего) это: _objectContext еще жив? (что означает, что он «будет» осведомлен об изменениях, внесенных в запись, поэтому достаточно просто вызвать Attach () и затем Save ()!?!?)

Что мне не хватает?

Среда разработки: VS2010RC - Entity Framework 4 (без POCO)

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 22 марта 2010

Вы добавляете культуру в контекст, но не говорите контексту, что объект действительно изменился.

Сгенерированный код на моем компьютере:

public void UpdateDepartment(Department currentDepartment) {
    if ((currentDepartment.EntityState == EntityState.Detached)) {
        this.ObjectContext.AttachAsModified(currentDepartment, this.ChangeSet.GetOriginal(currentDepartment));
    }
}

Что важно, так это AttachAsModified.

0 голосов
/ 29 марта 2010

Тимор указал мне верное направление, решение (что касается моей проблемы) очень простое: просто добавьте этот метод в репозиторий, и мы закончили:

public void AttachModified(T entity)
{
            _objectSet.Attach(entity);
            _context.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);            
} 

Теперь вместо вызова Attach () мы вызываем AttachModified ().

Спасибо, Тимор!

...