0

我在 Silverlight 5 中使用带有实体框架的 RIA 服务。我有一张下Foo表;

Fooid
FooName
FooCode
FooRef

Fooid是一个自动递增的数字 - 就像保存时的魅力一样......
FooName在 ViewModel 中设置 - 在保存时工作正常......
FooCode是一个 3 字母代码,例如 GRN、SIP、XYZ ......这也在 ViewModel 中设置。 . 没问题
FooRef是递增整数。例如服务器上最后保存的值是 100,现在下一次保存应该是 101。

我对如何获得这个最新号码有点困惑。我研究了一下,我发现了两种方法,但我对使用这些方法感到困惑,需要帮助如何实施。

First Method
从 ViewModel,我可以从 RIA 服务调用一个 INVOKE,它可以为我提供最后保存的FooRefint。我可以将它加 1 并在 SubmitChanges 上传递值。
Problem with First Method :我用这种方法面临的问题是,假设他们的工作站上有 3 个用户在不同的位置。他们都开始创建一个新的Foo,当他们调用调用方法时,他们都将被赋予相同的值,这打破了整个概念。

Second Method
我以某种方式拦截服务器上的 Add 方法,可能是通过存储库,并FooRef在添加此实体并提交更改之前获取值。

有人可以帮忙吗?

4

2 回答 2

0

您应该允许您的数据库为您的 Foo 记录分配身份,而不是试图猜测要提供的身份。在多用户系统中几乎是不可能完成的任务。

使用 WCF RIA 服务保存实体时,您可以获得通过以下方式分配的标识:

riaContext.SubmitChanges ( (op) =>
  {
    if (!op.HasError)
    {
      var identityAdded = ((Entity) op.ChangeSet.FirstOrDefault()).GetIdentity();
    }
  }
于 2012-07-03T16:52:09.543 回答
0

最后,我只是继续使用 Invoke 方法,并在调用回调函数中,我最终将上下文提交给服务器。

context.GetAssignedFooRef((op =>
        {
          entityNewFoo.FooRef = op.Value; // assign return int to FooRef

          context.Foo.Add(entityNewFoo);
          context.SubmitChanges();
         }

这就是我解决问题的方式,我不知道它是否是一个理想的解决方案,甚至接近它,但它适用于我。我面临的唯一问题是,如果有另一个用户在第一个保存之前从调用中寻找 FooRef。这是验证开始的地方,如果数据库中存在相同的 FooRef,我将请求一个新的 FooRef。

于 2012-07-10T01:23:49.710 回答