【问题标题】:RIA Services Repository Save does not work?RIA 服务存储库保存不起作用?
【发布时间】:2010-03-22 10:10:55
【问题描述】:

做我的第一个基于 SL4 MVVM RIA 的应用程序,我遇到了以下情况: 似乎更新了 SL 客户端中的记录(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 - Entity Framework 4(无 POCO)

提前致谢

【问题讨论】:

  • 我还想在我的 SL 客户端中创建一个通用存储库。你能给我举个例子吗? IObjectContext 接口代表什么?我知道 DomainContext 没有实现 IObjectContext 等,你能提供一些学习资源吗?谢谢。

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


【解决方案1】:

你在上下文中附加了文化,但你并没有告诉上下文对象实际上已经改变了。

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

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

重要的是“AttachAsModified”。

【讨论】:

    【解决方案2】:

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

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

    现在我们调用 AttachModified(),而不是调用 Attach()。

    谢谢蒂莫尔斯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 2020-04-25
      • 1970-01-01
      • 2014-12-13
      相关资源
      最近更新 更多