5

Ich möchte eine neue Zeile in meiner Datenbank für eine Tabelle erstellen, die eine Reihe von Fremdschlüsselbeziehungen hat, und ich konnte nicht herausfinden, welche Reihenfolge und welche Aufrufe vorgenommen werden müssen. Das ist, was ich habe, so weit:Wie erstellt man Fremdschlüsselbeziehungen mit dem Entity Framework?

db.Models.Order order = DB.Models.Order.CreateOrder(apple); 
order.CustomerReference.Attach((from c in db.Customer where c.Id == custId select c).First()); 
db.SaveChanges(); 

Der Code wird in der zweiten Zeile andernfalls, nämlich:

Attach ist keine gültige Operation, wenn das Quellobjekt mit diesem verknüpften Ende zugeordnet ist in einem hinzugefügten, gelöschten, oder abgelösten Zustand. Objekte geladen mit der NoTracking Merge-Option sind immer getrennt.

Irgendwelche Ideen?

Antwort

8

(Dank John für die Grammatik Korrekturen)

Also habe ich es aus. Dies ist, was Sie zu tun haben:

db.Models.Order order = DB.Models.Order.CreateOrder(apple); 
order.Customer = (from c in db.Customer where c.Id == custId select c).First(); 
db.SaveChanges(); 

Ich hoffe, dass hilft den Menschen.

6

Warum verwenden Sie keine Entity-Referenzen? Ihre Methode wird eine zusätzliche SELECT Anweisung verursachen.

eine viel schönere Art und Weise ist die CustomerReference Klasse und ein EntityKey zu verwenden.

order.CustomerReference = new System.Data.Objects.DataClasses.EntityReference<Customers>(); 
order.CustomerReference.EntityKey = new EntityKey("ModelsEntities.Customers", "Id", custId); 
+1

ich nicht Ihre Lösung nach etwas dagegen hätte, aber ich möchte Namen stark typisierten Datenbankspalte verwenden, so kann ich Compiler-Fehler erhalten wenn die Beziehung ungültig ist. – Jared

+0

Ich stimme mit kirkmphspherson überein, sein Weg vermeidet die zusätzliche SELECT. Ich schätze, Sie schätzen wartbaren Code über die Leistung. Sie können immer noch seinen Weg verwenden, aber anstelle von fest codierten Strings können Sie Reflektion verwenden, um die Strings zu generieren, indem Sie im obigen Beispiel die Klassennamen für ModelsEntities und Customers abrufen. Auf diese Weise erhalten Sie sowohl einen SELECT-Fehler als auch starke Tipp-/Kompilierzeitfehler. Der zusätzliche Aufwand aus der Reflektion sollte kein Problem IMO sein. – jamiebarrow

+0

Okay, Sie können Reflektion verwenden, um den Namen des Entitätssatzes zu generieren, aber nicht den Schlüsselnamen (d. H. Kann "ModelsEntities.Customers" mit starker Typisierung erzeugen). Gibt es eine Möglichkeit, die "Id" mittels Reflektion zu generieren? – jamiebarrow

0

Für hier Update ist ein Beispielcode:

using (var ctx = new DataModelEntities()) 
{ 

     var result = (from p in ctx.UserRole.Where(o => o.UserRoleId == userRole.UserRoleId) 
           select p).First(); 

     result.RolesReference.EntityKey = new EntityKey("DataModelEntities.Roles", 
             "RoleId", userRole.RoleId); 

     result.UserRoleDescription = userRole.UserRoleDescription;  
     ctx.SaveChanges(); 
}