【问题标题】:MVVM Ria Services. Update existing EntityMVVM Ria 服务。更新现有实体
【发布时间】:2013-03-17 19:33:56
【问题描述】:

我找到的每篇文章都展示了如何使用 RIA 添加新项目。没有人更新现有数据吗?它肯定看起来不像。

场景:

我正在使用我的虚拟机中的服务来拉入我的实体。然后在我看来使用虚拟机编辑实体。然后我想将我的实体保存回数据库。我不想添加它。我不想删除它。我想更新它。我在服务器端看到了该方法,但我所拥有的只是在我的数据上下文上提交更改。

我试图克隆原始实体,然后附加原始实体并将当前实体复制到它上面

public void SaveDoctors(Doctors current, Doctors original, Action<SubmitOperation> callback)
        {
            var ctx = new RefereeDomainContext();

            ctx.Doctors.Attach(original);
            original = current;
            ctx.SubmitChanges(callback,null);


        }

这也不起作用。我今天浏览了 10 多个博客,我发现的所有内容都与添加新实体有关,即使他们声称会向您展示如何更新实体。

我可以轻松地将实体发送到服务器端并在那里执行,但我不知道这是正确的形式。

更新实体的合适位置在哪里?我正在使用 SL5,我不确定如何告诉您我使用的是哪个版本的 RIA 服务。

澄清

我使用视图模型中的服务调用检索我的实体:

Doctors doctors = GetService<IDoctors>.GetDoctor().FirstorDefault(d=>d.id=xxxx);

我将医生实体推送到我的 VM 结构中:

DoctorsVM=new DoctorsVM(doctors);

这包含对通过视图模型的属性编辑的医生的引用。任何 Children 都填充到子对象的 ObservableCollections 中。

当我处理完这个特定实体并准备好保存它时:

GetService.UpdateCurrentDoctor(DoctorsVM.Doctor)//引用原始实体。

这就是我失去它的地方。如果我这样做:在我的方法内部它不起作用

var ctx=new DataContext;
ctx.Attach(currentDoctor);//attaches as unmodified

ctx.Add(currentDoctor);//creates a new Entity. Dont want that. 

ctx.AttachAsModified 仅在服务器端可用。 ctx.UpdateDoctors 仅在服务器端可用。

这就是我迷路的地方。

我来自 WPF/桌面背景,所以也许我只是迷失在整个异步环境中。我只需要朝着正确的方向前进。

【问题讨论】:

    标签: silverlight mvvm wcf-ria-services


    【解决方案1】:

    这个问题有点长,所以回答可能有点长:)

    如果你真的需要实体,你不应该克隆它!

    背景 在实体模型中,我们有每个实体的键。如果您检查域服务,您将看到所有 CRUD 操作都由该键属性完成。如果您从服务器端返回一个集合,两个实体具有相同的密钥,您将在客户端看到其中一个。

    回答 它很容易更新记录。只需使用 DomainService 类实例获取实体获取要修改的项目然后提交即可。就是这样。

          //a line of unsafe-dummy code
          domService.GetDoctorByID("124..").FirstOrDefault().CitizenNumber='CN123';
    
          //domService class track changeset so it decide update
          domService.SubmitChanges();       
          //Update occurs by entity key i.e. DoctorID
    

    我看到“医生”的表达方式,我们还使用 silverlight 和 ria 服务开发医疗保健应用程序。祝你好运!

    【讨论】:

    • 但是问题是我没有一把信息带进来就编辑它。我把它带进来,把它返回给客户端导致它分离..让客户端操纵它,然后将其重新附加到域服务。但是客户端的附加附加为未修改。
    • 从你问题的标题“MVVM Ria 服务。更新现有实体”我不明白。你的意思是你不改变一个领域,但它似乎改变了服务器?您是否跟踪了 ChangeSet 变量?除此之外,如果您不更改某些内容,则可以调用 Reject 而不是 Submit。
    • 生病编辑我的问题以使其更清晰。但是,是的,我正在更改实体。但是当它不再附加到数据上下文时我正在更改它,因为它从检索实体的我的服务交叉到用于获取它的视图模型。
    • 没关系。但是你为什么要把它和上下文分开呢?那时你想做什么? MVVM并不意味着你把它从服务中分离出来,但是你可以抽象出这些服务操作。
    • 我为每个操作实例化一个对数据上下文的新引用我不会在应用程序的整个生命周期中保留相同的数据上下文。
    【解决方案2】:

    看来您必须在一个会话期间保持数据上下文处于活动状态。我不喜欢这个,但它就是这样。我正在从应用程序的下一次搜索中重置域上下文,这样它就不会变得异常庞大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      相关资源
      最近更新 更多