2009-05-05 8 views
1

Angenommen, ich habe diese Tabellen:Wie aktualisiere ich den Fremdschlüsselwert eines Objekts mit LINQ zu Entities?

Fruits 
- FruitID  INT PK 
- FruitName  NVARCHAR(30) 
- FruitStatusID INT FK: Statuses 

Statuses 
- StatusID  INT PK 
- StatusName NVARCHAR(30) 

Wie aktualisiere ich sowohl den Namen des Obst- und seinen Status in der Datenbank in diesen Situationen ?:

  1. -Update ein Stück Frucht, die aus einer früheren kam L2E Anruf
  2. eine ganze Zahl entsprechend der FruitID gegeben (das heißt, ich habe keine volle Frucht Objekt in der Hand haben, mit zu beginnen)

VB oder C# ist in Ordnung, danke!

Antwort

2

This works ist aber nicht das, was ich hatte gehofft, für:

int StatusID = 4; // Some ID 
Fruit.FruidIDReference.EntityKey = 
    New EntityKey("MyEntities.Statuses", "StatusID", StatusID) 

Sicherlich gibt ein sauberer Weg, dies zu tun, die nicht hart codierte Strings erfordert (die Ausnahmen zur Laufzeit führt, wenn ich eine machen Tippfehler).

+1

ich auch nur realisiert werden: die ersten beiden Parameter aus dem bestehenden EntityKey Wert konstruieren können, so dass Sie zu hart Code haben sie nicht: New EntityKey (Fruit.FruitIDReference.EntityKey.EntityContainerName + "." + Fruit.FruitIDReference.EntityKey.EntitySetName, Fruit.FruitIDReference.EntityKey.EntityKeyValues ​​[0] .Schlüssel, 0) –

+0

Ich gebe das einen Versuch, danke für das Nachschlagen –

0

Wenn ein Frucht Objekt an eine andere Methode weitergegeben, können Sie:

  1. Pass einen Verweis auf das Kontextobjekt zusammen mit dem Obst und rufen Sie Savechanges()

  2. Machen Sie Ihre Änderungen an die Frucht Objekt in der niedrigeren Stufe Methode und rufen Sie Savechanges() in der Rufmethode (Sie überprüfen, zu können, wenn es geändert wurde, wenn Sie unnötige DB Anrufe zu vermeiden.)

Code:

//Change the name 
FruitEntities fe = new FruitEntities(); 
Fruit f = fe.Friuts.First(); 
f.FruitName = "NewName"; 
fe.SaveChanges(); 

//Get a fruit by ID and change the status 
//Statuses will need to be included as an Entity in your model with an association to Fruits 
int Id = 2; 
int newStatusID = 0; 
FruitEntities fe = new FruitEntities(); 
Fruit f = (from x in fe.Fruits 
      where x.FruitID == Id 
      select x).First(); 
Status s = (from y in fe.Statuses 
      where y.StatusID = newStatusID 
      select y).First(); 
f.Status = s; 
fe.SaveChanges(); 
+0

Das ist nett, weil nichts hart-codiert ist in Strings, aber es erfordert einen Umlauf in die Datenbank, um den Status zu laden. Gibt es eine Möglichkeit, das zu umgehen? –

+0

Da der Status eine Aufzählung ist, die sich nicht oft ändert (wenn überhaupt), können Sie eine Kopie der Statussammlung im Speicher (Anwendungsstatus für das Web) speichern und bei Bedarf abrufen. –

+0

Ein weiterer Tipp: Dies ist eine Menge Code, Sie könnten eine Erweiterungs-Methode oder etwas als Hilfe schreiben, um Ihren Code sauber zu halten. –

Verwandte Themen