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

时间:2011-11-23 16:50:22

标签: silverlight wcf-ria-services

我正在使用演示文稿和我的域名参与者之间的松散耦合。当客户端调用SubmitChanges时,它正确地在服务器上调用我的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
}

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

4 个答案:

答案 0 :(得分:2)

@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值。

答案 1 :(得分:0)

我从您的代码中假设您使用的是RIA服务。如果您已映射实体(包括表的ID),则只需将插入的标识返回到客户端的同一对象中。

如以下示例代码(从SO上的其他问题复制):

MyEntity ent = new MyEntity(); //entity that has Id, mapped 
//from primary key (Identity) from data base

MyDataContext.MyEntities.Add(ent);
MyDataContext.SubmitChanges(op => { 
  if (!op.HasError) MessageBox.Show(ent.Id.ToString()); 
});

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

我很高兴知道这是不必要的。

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