如何使用RIA服务插入2个新的相关DTO?

时间:2011-08-24 17:54:07

标签: c# silverlight ria

我在Silverlight应用程序中使用RIA服务。数据库实体不直接暴露给客户端,但我有一组POCO类。然后在这些POCO类的CRUD方法中,它们被转换为数据库实体并保存到数据库中。 当客户端创建2个相关的新POCO实体时,问题出现在服务器端。在服务器上为每个POCO实体单独调用Insert方法,我可以在那里创建相应的新数据库实体并将它们添加到对象上下文。但我认为没有办法在这些创建的数据库实体之间添加关系。有解决方案吗?

例如,我有这两个POCO实体(简化):

[DataContract(IsReference = true)]
public partial class Process
{
    [DataMember]
    [Key]
    public string Name
    {
       get; set;
    }

    [DataMember]
    public long StepId
    {
       get; set;
    }

    [DataMember]
    [Association("StepProcess", "StepId", "Id", IsForeignKey=true)]
    public Step Step
    {
       get; set;
    }
}

[DataContract(IsReference = true)]
public partial class Step
{
    [DataMember]
    [Key]
    public long Id
    {
       get; set;
    }

    [DataMember]
    public string Name
    {
       get; set;
    }
}

我的域服务类中有这两个Insert方法:

public void InsertProcess(Process process)
{
    var dbProcess = new DBProcess();
    dbProcess.Name = process.Name;
    //dbProcess.StepId = process.StepId;  Cannot do that!
    this.ObjectContext.AddToDBProcess(dbProcess);
}

public void InsertStep(Step step)
{
    var dbStep = new DBStep();
    dbStep.Name = step.Name;
    this.ObjectContext.AddToDBSteps(dbStep);

    this.ChangeSet.Associate<Step, DBStep>
            (step, dbStep, (dto, entity) =>
            {
                dto.Id = entity.Id;
            });
}

客户端添加一个新进程,然后创建并向其添加一个新步骤,然后调用SubmitChanges()。 Process.StepId没有填充正确的值,因为新创建的步骤没有正确的Step.Id,所以我不能只将此值复制到数据库实体。 那么问题是如何重新创建新创建的数据库实体之间的关系,就像它们在新创建的DTO中一样?

我知道Composition属性,但它不适合我们。 Process和Step都是独立的实体(即步骤可能没有进程而存在)。

2 个答案:

答案 0 :(得分:0)

有两种方法可以解决这个问题:

  1. 让每个调用在创建后返回项目的主键,然后您可以将生成的PKey存储在另一个POCO中以调用第二个服务。

  2. 创建一个服务方法,将两个POCO作为参数,并为您做好相关工作。

答案 1 :(得分:0)

谢谢,虽然这两个建议都有效,但它们也只适用于简单和小对象层次结构,而不是我的情况。我最终使用类似于this的方法。即我有一个POCO到数据库对象图。如果Process和Step都是新的,则在InsertProcess方法process.Step导航属性中填充此新步骤(否则可以使用StepId作为现有步骤的引用)。所以如果这个process.Step在map中我只是在DBProcess中填充相应的导航属性,否则我创建DBStep的新实例,将它放到地图然后将其设置为DBProcess.Step导航属性。这个新的空DBStep稍后将在InsertStep方法中填充。