2010-07-08 12 views
11

Wie kann ich eine Entität aktualisieren, ohne einen Anruf, um es auszuwählen machen zu müssen. Wenn ich den Schlüssel für die Entität bereitstelle, sollte sie nicht wissen, dass sie aktualisiert werden soll, nachdem SaveChanges() für den ObjectContext aufgerufen wurde.EF4 Aktualisierungsentität Ohne Ersten Ersten Entity

ich zur Zeit dies zu tun:

var user = context.Users.Single(u => u.Id == 2); 
user.Username = "user.name"; 
user.Name = "ABC 123"; 
context.SaveChanges(); 

Das funktioniert, aber erzwingt eine Auswahl. Weil ich die Id wissen, warum kann ich nicht etwas tun, wie folgt aus:

var user = new User(); 
user.Id = 2; 
user.Username = "user.name"; 
user.Name = "ABC 123"; 
context.UpdateObject(user); 
context.SaveChanges(); 

Vielen Dank im Voraus.

EDIT: Außerdem ist es wichtig, dass nur die betroffenen Eigenschaften, die aktualisiert werden geändert. Ist das möglich?

Antwort

12

Vielleicht feinen folgenden Code zu arbeiten.

var user = new User(); 
user.Id = 2; 
context.Users.Attach(user); 

user.Username = "user.name"; 
user.Name = "ABC 123"; 

context.SaveChanges(); 
+0

Das * aktualisiert * das Objekt in der Datenbank nicht wirklich. Es fügt es jedoch der Liste der Benutzer hinzu. – TheCloudlessSky

+0

Aufruf 'context.ObjectStateManager.GetObjectStateEntry (Benutzer) .ChangeState (EntityState.Modified);' funktioniert das Update durchführen ... – TheCloudlessSky

+1

Haben Sie die Eigenschaft Name nach ändern "context.Users.Attach (Benutzer);"? – user386740

-1

Haben Sie nicht haben, um es auszuwählen jeden Fall ist es Daten zu erhalten zu bearbeiten? Wenn Sie es zwischenspeichern, kostet es nichts, es beim Speichern wieder zu bekommen.

+9

In einer typischen Webanwendung machen Sie die Auswahl, generieren eine Seite mit den IDs und "vergessen Sie es". Nachdem der Benutzer die Informationen aktualisiert und das Formular übermittelt hat, erhalten Sie die ID und die neuen Daten zurück. Dies ist, wenn Sie nur aktualisieren möchten, anstatt die Daten zu holen, brauchen Sie keine zusätzliche Zeit vor der Aktualisierung. – Yakimych

+1

@Yakimych - Genau das ist die Situation, mit der ich arbeite. Ich muss nicht wirklich eine Reise zum db machen, um es auszuwählen, obwohl ich die Daten habe. – TheCloudlessSky

4

Sie können dies in einer etwas künstlichen Art und Weise, indem das Unternehmen das Hinzufügen und Ändern der EntityState Modified:

var user = new User(); 
user.Id = 2; 
user.Username = "user.name"; 
user.Name = "ABC 123"; 

context.AddToUsers(user); 
ObjectStateEntry userEntry = context.ObjectStateManager.GetObjectStateEntry(user); 
userEntry.ChangeState(EntityState.Modified); 

context.SaveChanges(); 

Auf diese Weise werden Sie die Object erzählen einen Eintrag mit Id = 2 zu finden und Aktualisieren Sie es, anstatt einen neuen Eintrag zur Datenbank hinzuzufügen.

+1

Ok, das ist cool. Das funktioniert aber * ein * Problem. Was, wenn ich nur die Eigenschaft 'Name' ändern möchte. Ich möchte nicht, dass alle Felder ein Update verursachen. Ist das eine Einschränkung bei EF? – TheCloudlessSky

+0

es funktioniert wie ein Charme ... danke. – sikender

Verwandte Themen