2012-04-06 8 views
2

Ich habe folgende Datenmodell:Handle Navigationseigenschaften beim Hinzufügen neuer Objekt Entitätsmodell

enter image description here

Ich schreibe einen WCF-Dienst, der das Hinzufügen neuer Bericht unterstützen muss:

public bool CreateNewReport(Report report) 
    { 
     MyEntities context = new MyEntities(); 
     context.AddToReports(Report); 
     context.SaveChanges(); 
    } 

Daher ruft meine Methode ein Berichtsobjekt ab, das auf dem Client erstellt wurde, und fügt es über den Datenkontext zur Datenbank hinzu. (alle Mitglieder sind im DataContract enthalten)

Meine Frage bezieht sich auf Navigationseigenschaften.

  1. Muss der Client auch ein Benutzerobjekt erstellen und es in das neue Berichtsobjekt einfügen, bevor es gesendet wird?
  2. Was ist der beste Weg, um dies zu nähern? Eine Möglichkeit, die ich denke, ist ein UserId Feld in der
  3. hinzufügen, wenn ein neuer Bericht eingefügt wird, wie aktualisiere ich die nav Eigenschaft UserEntity Report, die mit dem neuen Bericht?

Danke.

+1

Eine Randnotiz: Verwenden Sie immer entity context mit: 'using (var ctx = new MyEntities()) {...}'. Dies ruft 'Dispose' am Ende des Verwendungsblocks auf, der alle verwendeten Ressourcen freigibt ... –

+0

@RicoSuter guter Punkt, danke – Michael

Antwort

1

Wenn Sie Ihre Datenbank importieren, generieren Sie Navigationseigenschaften (die Eigenschaften in Ihrem Bild) und ausländische ID-Eigenschaften (dann haben Sie zum Beispiel eine Benutzer-und UserID-Eigenschaft in Ihrer Berichtsklasse). Auf diese Weise können Sie die Benutzer-ID in Ihrem Client festlegen und an den Server senden und mit AddToReports ... hinzufügen. Wenn Sie das gesamte Benutzerobjekt senden, müssen Sie es an den Entitätskontext anhängen, ansonsten wird der Benutzer erneut erstellt. . die referenzierte Benutzer

Attach: (aber es ist besser, den Benutzer nur von ID zu senden)

public bool CreateNewReport(Report report) 
{ 
    using (MyEntities context = new MyEntities()) 
    { 
     context.AddToReports(Report); 
     context.Users.Attach(report.User); 
     context.SaveChanges(); 
    } 
} 

um den Bericht eines Benutzers zu ändern:

public bool ChangeUserToNewReport(int userid, Report newReport) 
{ 
    using (MyEntities context = new MyEntities()) 
    { 
     var user = context.Users.Single(u => u.ID = userid); 
     user.Report = newReport; 
     context.SaveChanges(); 
    } 
} 

für einen vorhandenen Bericht:

public bool ChangeUserReport(int userid, Report existingReport) 
{ 
    using (MyEntities context = new MyEntities()) 
    { 
     context.Reports.Attach(existingReport); 
     var user = context.Users.Single(u => u.ID = userid); 
     user.Report = existingReport; 
     context.SaveChanges(); 
    } 
} 

Dies ist ein Beispiel, wie Ihr Modell aussehen sollte. Doppelklicken Sie auf die Zuordnungszeile, um den Dialog zu öffnen. Sie können sehen, dass die Eigenschaften Person und PersonID identisch sind. Wenn Sie Ihr Modell so erstellen, sollte VS das korrekte SQL generieren.

+0

Vielen Dank, würde es Ihnen etwas ausmachen, mir zu zeigen, wie ich es tun würde, wenn ich UserID ausländische ID Eigentum hätte in der Berichtsklasse, wie du es vorgeschlagen hast? Wie würde ich die Tabelle Benutzer auf den neuen Bericht aufmerksam machen? – Michael

+0

Ich verstehe deine Frage nicht. Ich nehme an, Sie haben bereits einen Fremdschlüssel 'ReportID' in Ihrer Datenbank, von dem die Navigationseigenschaft' Report' abgeleitet ist. Mit den 'ReportID' und' Report' Eigenschaften haben Sie nur zwei Möglichkeiten auf diesen Fremdschlüssel zuzugreifen (die 'Report' Eigenschaft unterstützt Lazy Loading usw.) –

+0

Entschuldigung, da ich neu mit EF bin und mein Datenbankwissen nicht so ist groß. Von dem, was ich verstehe, haben Sie vorgeschlagen, dass ich eine weitere Eigenschaft zu 'ReportEntity' hinzufügen soll, die' UserId' (nicht die PK auf der 'UserEntity') genannt wird und sie aktualisiere, wenn ich einen neuen Bericht erstelle.Auf diese Weise würde ich kein Benutzerobjekt erstellen und es in Report einkapseln müssen, wenn ich es vom Client aus sende. richtig ? Außerdem habe ich eine One to Many Beziehung mit Report und Usern – Michael

Verwandte Themen