【问题标题】:How is a server generated primary key returned to the RIA client服务器生成的主键如何返回给 RIA 客户端
【发布时间】:2013-03-18 06:47:13
【问题描述】:

我在演示文稿和我的域实体之间使用松散耦合。当客户端调用 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
}

在插入主键的过程中确定(服务器端)客户端明明需要这个信息,它是怎么得到的呢?

【问题讨论】:

    标签: silverlight wcf-ria-services


    【解决方案1】:

    @GarethOwen 即使使用 POCO 对象,只要将它们设置为服务中的 POCO 对象,它们的 id 值也应该在客户端上更新。通常,如果您不使用 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 值。

    【讨论】:

    • 事实上我们确实使用 GUID 作为主键值。
    【解决方案2】:

    根据您的标签,我假设您正在使用 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()); 
    });
    

    【讨论】:

    • 我更新了我的问题,更详细地说明了正在发生的事情以及为什么您的答案在我的特定情况下不足。
    • 好清楚,所以您将 RIA 服务对象映射到自定义数据对象,然后将这些自定义数据对象发送回 ria 服务以插入?您是否使用实体框架来存储这个自定义类 PersonInfo?然后您可以在插入方法中将身份返回为 f.i.一个常规的 int 并在客户端自己做自定义类的映射?
    【解决方案3】:

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

    【讨论】:

    • 由于InsertPersonInfo函数返回void,ID值如何返回给客户端?
    • update、insert 和 delete 方法确实返回 void,但实际对象是通过引用传递给域服务的,因为这是 c# 首先处理变量的方式。因此,任何影响服务器端变量的更改都会通过域服务连接通过引用传递回客户端。因此,即使 insert、update 和 delete 方法返回 void,但客户端的值仍在更改和更新。
    • @devnew,如果您将命令作为答案,我当然会做得很好。我已经验证客户端和服务器之间的 RIA 服务完全按照您的描述进行。在我的辩护中,我会说通过网络传递引用并不完全直观, - 但我喜欢它;)
    【解决方案4】:

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

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

    如果没有必要,我将不胜感激。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      相关资源
      最近更新 更多