2009-03-04 7 views
1

Ich versuche, mich zu fragen, wie neue Datensätze zu einer Tabelle, die einen Fremdschlüssel zu einer anderen Tabelle mit LINQ to Entities haben hinzufügen. Ich werde versuchen und erklären:Erstellen Sie neue LINQ to Entities Objekte mit Verknüpfungen

Angenommen, ich habe eine einfache Datenbank mit zwei Tabellen. Zum Beispiel können wir ein LibraryItem und den anderen LibraryItemStatus aufrufen. Das LibaryItem verfügt über einen Fremdschlüssel für die LibraryItemStatus-Tabelle, sodass einem Element ein Status zugewiesen werden kann.

Meine Frage ist, wie ich ein neues LibraryItem mit LINQ To Entities erstellen und es mit einem Status verknüpfen? Mein Code unten muss falsch sein, aber ich kann keine Beispiele finden, um zu helfen.

LibraryEntities entities = new LibraryEntities(); 

LibraryItem item = new LibraryItem(); 
item.Name = "some name"; 
item.SomeAttribute = "x"; 
// What do I do here? 
// This seems wrong as I don't want a new status. 
item.Status = new Status() { id = 1 }; 
// This seems wrong as I don't really want to have to query the repository 
item.Status = entities.Status.First(s => s.StatusID == 1); 
// 
entities.AddToItems(item); 
entities.Savechanges(); 

Antwort

0

Dies ist die "richtige" Art und Weise:

item.Status = entities.Status.First(s => s.StatusID == 1); 

oder:

item.Status = entities.GetObjectByKey(new EntityKey("MyContext.Status", "StatusID", 1)); 

..., die aus dem Speicher geladen werden, wenn das Objekt bereits (entities.Status.First geladen werden immer Abfrage der DB).

Dies ist die "Hacky aber schneller Weg":

item.StatusReference.EntityKey = new EntityKey("MyContext.Status", "StatusID", 1); 

Gut: Nie jede Abfrage. Schlecht: Sie können nicht auf item.Status verweisen; es wird immer noch null sein.

aktualisieren: There will be a better way to do this in .NET 4.0.

0

Suchen Sie nach einer item.StatusReference-Eigenschaft. Dies ermöglicht eine gewisse Entdeckung/Einstellung von Metadaten in der Beziehung, ohne tatsächlich danach zu fragen.

0

Sie können auch die zugehörige Tabelle auf Ihre ItemEntity im entitymodel kartieren.

Ich habe das für den ProductName in Produkt -> ProductLanguage in meinem Projekt auf der URL unten veröffentlicht.

openticket.codeplex.com