RIA服务中SubmitChanges的AutoIncrement

时间:2012-07-03 07:04:08

标签: c# silverlight wcf-ria-services auto-increment submitchanges

我在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,它可以为我提供最后保存的FooRef int。我可以将它添加1并传递SubmitChanges上的值 Problem with First Method :我使用此方法遇到的问题是,假设在不同位置的工作站有3个用户。他们都开始创建一个新的Foo,当他们调用invoke方法时,他们都将被赋予相同的值,这会破坏整个概念。

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

Onyone可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

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

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

riaContext.SubmitChanges ( (op) =>
  {
    if (!op.HasError)
    {
      var identityAdded = ((Entity) op.ChangeSet.FirstOrDefault()).GetIdentity();
    }
  }

答案 1 :(得分:0)

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

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

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

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