我在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可以帮忙吗?
答案 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。