做我的第一个基于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)
提前致谢
答案 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!