asp.net - Wie aktualisiere ich eine Entität ohne Roundtrip? (EF 4)

Translate

Ich habe folgendes versucht:

public void UpdatePlayer(int id)
{
    Player player = new Player() {ID  = id};
    player.Password = "12";
    Entities.Players.Attach(player);
    Entities.SaveChanges();
}

Keine Änderung an der Datenbank.
Was vermisse ich?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Ich denke, es könnte daran liegen, dass Sie die Werte festlegen, bevor Sie das Objekt anhängen - der Datenkontext weiß nicht, welche Felder sich geändert haben. Versuchen:

public void UpdatePlayer(int id)
{
    Player player = new Player() {ID  = id};
    Entities.Players.Attach(player);
    player.Password = "12";
    Entities.SaveChanges();
}
Quelle
Translate

Anhängen wird für Entitäten verwendet, die bereits in der Datenbank vorhanden sind. Sie müssen sie jedoch zuerst anhängen und dann bearbeiten, wie in einem anderen Poster hervorgehoben. Sie sollten .Add anstelle von .Attach verwenden, wenn Sie neue Elemente erstellen.

Zu Ihrer InformationEntity Framework 4 - AddObject vs Attach

Quelle
Translate

Wie bereits erwähnt, wird die Entität beim Anhängen auf den Status "Unverändert" gesetzt, sodass Sie den Status manuell auf "Geändert" setzen müssen. Beachten Sie jedoch, dass das Festlegen des Status für die gesamte Entität dazu führen kann, dass alle Felder aktualisiert werden. Wenn Ihre Player-Entität mehr als ID- und Kennwortfelder enthält, werden wahrscheinlich alle anderen Felder auf Standardwerte gesetzt. Versuchen Sie für einen solchen Fall Folgendes zu verwenden:

Entities.Players.Attach(player);
var objectState = Entities.ObjectStateManager.GetObjectStateEntry(player);
objectState.SetModifiedProperty("Password");
Entities.SaveChanges();

Sie können auch versuchen, das Kennwort nach dem Anhängen der Entität festzulegen:

Entities.Players.Attach(player);
player.Password = "12";
Entities.SaveChanges();
Quelle
Translate

Wenn Sie eine Entität mit anhängenAnfügenMethode wird die Entität gehenUnverändertEntityState, dh es hat sich nicht geändert, seit es an den Kontext angehängt wurde. Daher generiert EF keine erforderliche Aktualisierungsanweisung, um die Datenbank zu aktualisieren.

Alles, was Sie tun müssen, ist, EF einen Hinweis zu geben, indem Sie das ändernEntityStatezuGeändert:

Entities.Players.Attach(player);    
Entities.ObjectStateManager.ChangeObjectState(player, EntityState.Modified)    
Entities.SaveChanges();
Quelle
Über den Autor