Сохранение репозитория служб RIA не работает?

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

EntityActions.nil� b9 http://schemas.microsoft.com/2003/10/Serialization/Arrays^HasMemberChanges�^Id�^ Operation�Update

Я предполагаю, что это говорит только: эй! 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)

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


person Savvas Sopiadis    schedule 22.03.2010    source источник
comment
Я также хочу сделать общий репозиторий в моем SL-клиенте. не могли бы вы дать мне пример того, как это сделать? что означает интерфейс IObjectContext? Я знаю, что DomainContext не реализует IObjectContext и т. Д., Не могли бы вы предоставить некоторые учебные ресурсы? благодаря.   -  person Shimmy Weitzhandler    schedule 09.05.2011


Ответы (2)


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

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

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

Важно то, что «AttachAsModified».

person Timores    schedule 22.03.2010

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

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

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

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

person Savvas Sopiadis    schedule 29.03.2010