【发布时间】:2012-01-12 07:09:43
【问题描述】:
我无法再次调用 WCF RIA 服务以在客户端刷新数据。这是我的情况:
在服务器端,域服务类似于:
public IQueryable<Person> GetPersonByID(int id)
{
var result = this.ObjectContext.Persons.
Where(e => e.PersonID == id);
return result; // check point 1
}
在客户端,我通过以下方式进行调用(这是通过我称为“刷新”按钮的按钮调用):
this._amsService.Context.Load<Person>(
this._amsService.Context.GetPersonByIDQuery(this.Person.ID),
LoadBehavior.RefreshCurrent,
result =>
{
this.Person = result.Entities.FirstOrDefault(); //check point 2
this.RaisePropertyChanged("Person");
}, null);
这是我正在尝试的:
假设我在 DB 中有一个人,其数据为 personID=1、Age = 16。
然后运行应用程序,我以正确的方式获取数据。
然后去数据库,用SQL更新数据改成
Age = 20。然后回到app点击“刷新”按钮拨打新电话,但是年龄没有更新到
20,还是16。
我在调试模式下运行应用程序,并检查数据:
在检查点1,我检查结果中的数据,没关系,Age = 20。
在检查点2,我检查result.Entities中的数据,数据没有刷新,还是Age = 16。
我试过LoadBehavior.MergeIntoCurrent,LoadBehavior.RefreshCurrent,但没有成功。
所以我需要刷新 SL 应用程序主机页面以重新加载整个 SL 应用程序,然后我才能看到新数据。这是最终用户不能接受的。
我不明白为什么。我也尝试使用fiddler在点击刷新按钮时捕捉数据,数据确实得到了最新的Age = 20。
如何解决这个问题?
【问题讨论】:
-
明确一点,在“this.RaisePropertyChanged("Person");”处设置断点时会看到什么?
-
你能调试你的服务器端代码,看看返回了什么吗?如果实体缓存在服务器端的会话中,这可能是数据未更新的原因。此外,您无需在客户端重新设置 person 属性,只需运行查询,RIA 服务就会在当前 person 上引发 age 属性更改事件。
-
我认为你应该在服务器端添加 submitchanges()
标签: silverlight-4.0 wcf-ria-services