【问题标题】:How to refresh instance of entity at client side with wcf ria service?如何使用 wcf ria 服务刷新客户端的实体实例?
【发布时间】: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=1Age = 16

  1. 然后运行应用程序,我以正确的方式获取数据。

  2. 然后去数据库,用SQL更新数据改成Age = 20

  3. 然后回到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


【解决方案1】:

首先,您是处于编辑模式的实体吗?如果您的实体处于编辑模式,RIA 将保留您的更改,并且仅在您再次加载实体时更新原始值。

您可以检查您的 Person 实体的 IsEditing 属性以找出答案。并尝试检查您的实体的 OriginalValue。 var original = Person.GetOriginal()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2011-09-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多