/ / Wie füge ich mit RIA Service 2 neue DTOs ein? - c #, silverlight, ria

Wie füge ich 2 neue verwandte DTOs mit dem RIA-Service ein - c #, silverlight, ria

Ich benutze den RIA-Service in unserem SilverlightAnwendung. Datenbank-Entitäten sind nicht direkt einem Client ausgesetzt, aber ich habe eine Reihe von POCO-Klassen dafür. In CRUD-Methoden für diese POCO-Klassen werden sie dann in Datenbankentitäten konvertiert und in der Datenbank gespeichert. Das Problem tritt auf der Serverseite auf, wenn der Client zwei neue POCO-Entitäten erstellt, die miteinander verbunden sind. Die Einfügemethode wird auf dem Server für jede POCO-Entität separat aufgerufen, und ich kann dort entsprechende neue Datenbankentitäten erstellen und sie dem Objektkontext hinzufügen. Ich sehe jedoch keine Möglichkeit, eine Beziehung zwischen diesen erstellten Datenbankentitäten hinzuzufügen. Gibt es dafür eine Lösung?

Zum Beispiel habe ich diese 2 POCO-Entitäten (vereinfacht):

[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;
}
}

Und ich habe diese 2 Insert-Methoden in meiner Domain-Service-Klasse:

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;
});
}

Der Client fügt einen neuen Prozess hinzu, erstellt und fügt ihn hinzueinen neuen Schritt dazu und ruft dann SubmitChanges () auf. Process.StepId ist nicht mit einem korrekten Wert gefüllt, da es noch keine korrekte Step.Id für den neu erstellten Schritt gibt. Daher kann ich diesen Wert nicht einfach in die Datenbankentität kopieren. Die Frage ist also, wie Beziehungen zwischen neu erstellten Datenbankentitäten genauso wie in neu erstellten DTOs wiederhergestellt werden können.

Ich kenne das Kompositionsattribut, aber es ist für uns nicht geeignet. Sowohl Prozess als auch Schritt sind unabhängige Entitäten (d. H. Schritte können ohne Prozess existieren).

Antworten:

0 für die Antwort № 1

Es gibt zwei Möglichkeiten, dies zu lösen:

  1. Lassen Sie jeden Aufruf den Primärschlüssel für das Element zurückgeben, nachdem es erstellt wurde. Anschließend können Sie den resultierenden PKey im anderen POCO speichern, um den zweiten Dienst aufzurufen.

  2. Erstellen Sie eine Service-Methode, die beide POCOs als Parameter verwendet und diese für Sie in Beziehung setzt.


0 für die Antwort № 2

Vielen Dank, diese beiden Vorschläge sind zwar gültig, gelten aber auch nur für einfache und kleine Objekthierarchien, nicht für meinen Fall. Am Ende benutze ich einen ähnlichen Ansatz wie Dies. Das heißt Ich habe eine Zuordnung von POCO zu Datenbankobjekten. Wenn sowohl Process als auch Step neu sind, wird die Navigationseigenschaft process.Step in der InsertProcess-Methode mit diesem neuen Schritt gefüllt (andernfalls kann StepId als Verweis auf den vorhandenen Schritt verwendet werden). Wenn sich dieser process.Step in der Map befindet, fülle ich einfach die entsprechende Navigationseigenschaft in DBProcess aus. Andernfalls erstelle ich eine neue Instanz von DBStep, füge sie in die Map ein und setze sie dann auf die Navigationseigenschaft DBProcess.Step. Dieser neue leere DBStep wird später in der InsertStep-Methode gefüllt.