RIA Services Repository Save不起作用?

时间:2010-03-22 10:10:56

标签: entity-framework repository wcf-ria-services

做我的第一个基于SL4 MVVM RIA的应用程序,我遇到了以下情况: 更新SL-client中的记录(EF4,NO-POCOS !!)似乎发生了,但dbms中的值没有变化。使用Fiddler调试保存时的消息是(其中包括):

EntityActions.nil b9http://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();
        }

我知道currentCulture-Entity是分离的。令我困惑的是(除其他事项外)是:_objectContext还活着吗? (这意味着它“将会”知道对记录所做的更改,所以只需调用Attach()然后Save()就足够了!?!?)

我缺少什么?

开发环境:VS2010RC - 实体框架4(无POCO)

提前致谢

2 个答案:

答案 0 :(得分:1)

您正在上下文中附加文化,但您没有告诉上下文该对象实际已更改。

我在我的机器上生成的代码是:

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

重要的是'AttachAsModified'。

答案 1 :(得分:0)

Timores指出我正确的方向,解决方案(就我的问题而言)非常简单:只需将此方法添加到存储库中,我们就完成了:

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

现在我们调用AttachModified()来代替调用Attach()。

谢谢Timores!