我在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都是独立的实体(即步骤可能没有进程而存在)。
答案 0 :(得分:0)
有两种方法可以解决这个问题:
让每个调用在创建后返回项目的主键,然后您可以将生成的PKey存储在另一个POCO中以调用第二个服务。
创建一个服务方法,将两个POCO作为参数,并为您做好相关工作。
答案 1 :(得分:0)
谢谢,虽然这两个建议都有效,但它们也只适用于简单和小对象层次结构,而不是我的情况。我最终使用类似于this的方法。即我有一个POCO到数据库对象图。如果Process和Step都是新的,则在InsertProcess方法process.Step导航属性中填充此新步骤(否则可以使用StepId作为现有步骤的引用)。所以如果这个process.Step在map中我只是在DBProcess中填充相应的导航属性,否则我创建DBStep的新实例,将它放到地图然后将其设置为DBProcess.Step导航属性。这个新的空DBStep稍后将在InsertStep方法中填充。