2009-06-15 1 views
3

Angenommen, ich habe eine Zeile in der Datenbank mit einer bestimmten ID, die ich kenne (in meinem Beispiel unten - ein Symbol mit Id = 5), kann ich ein EntityObject erstellen an eine andere Entität angehängt werden, ohne dass sie von der Datenbank geladen werden muss (dasselbe Szenario gilt auch für "DeleteObject", wenn Sie darüber nachdenken ...)?Konstruieren von EntityObject von EntityKey ohne einen Datenbankaufruf in Entity Framework

Ich habe versucht, die folgenden:

UserSpread spread = UserSpread.CreateUserSpread(5, 500000, 1.1m, 1.5m); 

EntityKey symbolKey = new EntityKey("Entities.SymbolSet", "Id", 5); 

Symbol symbol = new Symbol(); 
symbol.EntityKey = symbolKey; 

// dealingEntities.Attach(symbol); 

spread.Symbol = symbol; 
Entities.AddToSpreadSet(spread); 

ich die folgende Ausnahme auf der „AddToSpreadSet()“ Methode:

„Das Objekt kann nicht auf die Object, weil sie bereits hinzugefügt werden hat einen EntityKey. Verwenden Sie ObjectContext.Attach, um ein Objekt mit einem vorhandenen Schlüssel anzuhängen. "

Wenn ich versuche, das Symbol an, bevor es zur Ausbreitung (Kommentarzeile) zuweisen, erhalte ich die folgende auf der „Savechanges()“ Methode:

„Das Objekt nicht angebracht werden kann, weil Der Wert einer Eigenschaft, die Teil des EntityKey ist, stimmt nicht mit dem entsprechenden Wert im EntityKey überein. "

Irgendwelche Ideen?
Danke,
Nir

Antwort

3

Der allgemeine Ansatz I verwenden, um nur einen Stub Entität zu erstellen (nur durch die PK Einstellung) und befestigen Sie es auf den Kontext.

So, hier ist ein Beispiel:

Category existing = new Category {ID = 7}; 
ctx.AttachTo("Categories", existing); // Notice no use of EntityKey anywhere 


// build a new product 
... 
product.Category = existing; 
ctx.AddToProducts(product); 
ctx.SaveChanges(); 

Das funktioniert gut für den Aufbau von Beziehungen, aber es gibt einige Einschränkungen beim Löschen. Also sollte auf jeden Fall meine EF tips series für weitere Informationen überprüfen. Und insbesondere diese:

Tip 9 - How to delete an object without retrieving it

this helps

Alex

+0

Schön! Funktioniert wie ein Zauber, vielen Dank! Nir. – nirpi

1

Es ist möglich, zu tun, was Sie fragen. Sie müssen etwas wie folgt tun:

dealingEntities.symbolReference.EntityKey = neuer EntityKey ("Entities.SymbolSet", "Id", 5);

Macht das Sinn? Ich habe vielleicht Ihre Entitätsnamen durcheinander, also fragen Sie mich, wenn Sie weitere Informationen benötigen.

+0

Wenn Sie versuchen, ein nicht verbundenes Modell zu verwenden, ist dies der richtige Weg. – JustEngland