Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 服务器生成的主键如何返回到RIA客户端_Silverlight_Wcf Ria Services - Fatal编程技术网

Silverlight 服务器生成的主键如何返回到RIA客户端

Silverlight 服务器生成的主键如何返回到RIA客户端,silverlight,wcf-ria-services,Silverlight,Wcf Ria Services,我在演示和我的域实体之间使用松散耦合。当客户端调用SubmitChanges时,它会正确地调用服务器上的my insert方法,传递“待添加”表示模型实例 服务器端代码将执行插入操作,包括生成主键。但是我如何将这个主键传递回客户机呢 更新: 作为对评论的回应,让我给出更多细节:是的,我使用的是RIA服务,但RIA服务与客户端交换的实体与进入数据库的实体不同。因此,我不能停留在服务器端的一些幕后魔术上。我的插入方法签名如下所示: public void InsertPerson(PersonInf

我在演示和我的域实体之间使用松散耦合。当客户端调用SubmitChanges时,它会正确地调用服务器上的my insert方法,传递“待添加”表示模型实例

服务器端代码将执行插入操作,包括生成主键。但是我如何将这个主键传递回客户机呢

更新: 作为对评论的回应,让我给出更多细节:是的,我使用的是RIA服务,但RIA服务与客户端交换的实体与进入数据库的实体不同。因此,我不能停留在服务器端的一些幕后魔术上。我的插入方法签名如下所示:

public void InsertPerson(PersonInfo source)
{


}
PersonInfo类如下所示:

public class PersonInfo
{
    [Key]
    public Guid Id { get; set; }
    public String Name { get; set; }
    // you get the point
}

在插入主键的过程中(服务器端),客户端显然需要这些信息,它是如何获得这些信息的?

从您的标签中,我假设您正在使用RIA服务。如果已经映射了包括表ID在内的实体,则只需将插入的标识返回到客户端的同一对象中即可

如下面的示例代码(复制自其他问题):


Rody是正确的,只要您在服务器端设置PersonalInfo对象的Id值,该对象将在提交更改完成后在客户端上更新。您是否试图在提交更改完成回调之外访问Id值?我假设这是一个异步请求?

我们有一个类似的松耦合架构。我们的DomainService与专为服务器-客户端通信而设计的POCO配合使用,因此我们的持久层对客户端(Silverlight和HTML5)隐藏得很好

据我所知,服务器端生成的ID不会发送回客户端。我们进行另一次查询以再次获取对象

如果这是不必要的,我将不胜感激


请参阅其他答案-这是可能的-我从这个问题中学到了一些东西,因此可以改进我们的代码。

@GarethOwen即使是POCO对象,只要id值设置为服务中的POCO对象,它们就应该在客户端上更新。通常情况下,如果不使用Guid,则不设置POCO ID。因此,如果您使用int作为ID,那么您可以这样做

public void InsertPOCO(POCOObj POCO)
{
   RealObj x = new RealObj();

   x.Info = ...(information)...;

   this.DataContext.RealObjs.InsertOnSubmit(RealObj);

   this.DataContext.SubmitChanges();

   // Once the Submit Changes has run, the x object will then have an id value associated with it, and you can now assign the ID value of the POCO Object
   POCO.Id = x.Id;
}

然后,您不必重新查询域服务的Id值。

我更新了我的问题,提供了更详细的信息,说明了发生了什么,以及您的答案在我的特定情况下不符合要求的原因。好的,请清除,这样您就可以将RIA服务对象的客户端映射到自定义数据对象,然后将这些自定义数据对象发送回ria服务以插入?您是否使用实体框架来存储此自定义类PersonInfo?然后,您可以在insert方法中将标识返回为f.i.常规int,并自己在客户端对自定义类进行映射?由于InsertPersonInfo函数返回void,ID值如何返回到客户端?update、insert和delete方法确实返回void,但是实际的对象是通过引用传递给域服务的,因为这是c#首先处理变量的方式。因此,在服务器端影响变量的任何更改都会通过域服务连接通过引用传递回客户端。因此,即使insert、update和delete方法返回空值,客户端上的值仍在更改和更新。@devnew,如果您将命令作为答案,我当然会让它变好。我已经验证了客户端和服务器之间的RIA服务正按照您所描述的做。在我的辩护中,我要说,通过参考线传递并不完全是直观的,但我喜欢它;)事实上,我们确实使用GUID作为主键值。
public void InsertPOCO(POCOObj POCO)
{
   RealObj x = new RealObj();

   x.Info = ...(information)...;

   this.DataContext.RealObjs.InsertOnSubmit(RealObj);

   this.DataContext.SubmitChanges();

   // Once the Submit Changes has run, the x object will then have an id value associated with it, and you can now assign the ID value of the POCO Object
   POCO.Id = x.Id;
}