代码之家  ›  专栏  ›  技术社区  ›  Savvas Sopiadis

RIA服务存储库保存不起作用?

  •  2
  • Savvas Sopiadis  · 技术社区  · 16 年前

    我第一次使用基于SL4 MVVM RIA的应用程序时遇到了以下情况: 更新记录(EF4,无POCOS!!)在SL客户机中似乎发生了,但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();
            }
    

    我知道当前的文化实体是分离的。让我(除其他事情外)困惑的是:ObjectContext还活着吗?(意思是“将要”????知道对记录所做的更改,因此只需调用attach()然后调用save()就足够了!?!?)

    我错过了什么?

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

    提前谢谢

    2 回复  |  直到 16 年前
        1
  •  1
  •   Timores    16 年前

    您在上下文中附加了区域性,但没有告诉上下文对象实际上已经更改。

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

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

    重要的是“attachasModified”。

        2
  •  0
  •   Savvas Sopiadis    16 年前

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

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

    现在,我们不再调用attach(),而是调用attachmodified()。

    谢谢你,提摩尔斯!