我正在使用演示文稿和我的域名参与者之间的松散耦合。当客户端调用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
}
在插入主键的过程中确定(服务器端)客户端显然需要这些信息,它是如何获得的?
答案 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不会被发送回客户端。我们再次进行查询以获取对象。
我很高兴知道这是不必要的。
请参阅其他答案 - 这是可能的 - 我从这个问题中学到了一些东西,并因此可以改进我们的代码。