2010-12-10 2 views
21

Alle Beispiele, die ich gefunden habe, beziehen sich auf eine Klasse namens ObjectContext, die anscheinend nicht in CTP5 existiert. Ich muss an dieser Stelle betonen, CTP5 ist meine erste Exposition gegenüber dem Entity Framework.EF 4.1 Code erzwingen Als erstes eine angehängte Entität als geändert ansehen

Ich habe eine getrennte POCO, die ich an meinen DbContext angeschlossen habe. SaveChanges nimmt die Änderung jedoch nicht auf, wie sage ich meinem Kontext, diese Entität zu aktualisieren?

_context.Users.Attach(user); 
// The user has been replaced. 
_context.SaveChanges(); 
// The change is not saved. 

Was mache ich falsch?

-Update 12.01.2011 Könnte die meisten, aber als Erstnutzer von EF offensichtlich sein, es hat mir nicht vor, dass ein Objekt angebracht, die bereits den vorherigen Zustand würde klar war, angebracht. Das hat mir sehr viel Schmerzen bereitet. Aber ich wollte das Repository-Muster in einer sehr allgemeinen Weise verwenden, eine Art, bei der es egal war, ob das Objekt bereits angehängt war oder als Ergebnis der ASP.NET MVC-Bindung neu erstellt wurde. Also ich brauchte eine UpdateUser Methode, und ich habe es unten angehängt.

public User UpdateUser(User user) { 
     if (_context.Entry(user).State == EntityState.Detached) { 
      _context.Users.Attach(user); 
      _context.Entry(user).State = EntityState.Modified; 
     } 
     return user; 
    } 

Das Verfahren nimmt offensichtlich, dass das Objekt in irgendeiner Art und Weise in dem Datenspeicher vorhanden ist, wird es UpdateUser schließlich genannt. Wenn das Objekt bereits angehängt ist, profitieren Sie vom vorherigen Status des Objekts, der wiederum eine optimierte Aktualisierung der Datenbank ermöglicht. Wenn das Objekt jedoch nicht angehängt wurde, zwingt die Methode das Ganze dazu, schmutzig zu werden.

Scheint jetzt offensichtlich, war vorher nicht. Hoffe es hilft jemandem.

Reiche

Antwort

29

Wenn Sie eine Entität anhängen , geht es zu Unverändert Zustand (es wurde nicht geändert, da es auf den Kontext beigefügt). zu Geändert alles, was Sie brauchen, um den Entity Staat explizit zu ändern:

_context.Users.Attach(user); 
_context.Entry(user).State = System.Data.Entity.EntityState.Modified; 
_context.SaveChanges(); 
+0

Perfekt, danke. Für alle, die es nicht wissen, befindet sich EntityState in der System.Data.Entity-DLL. – kim3er

+0

Kein Problem, froh, dass es geholfen hat :) –

+2

omg Ich kann dir nicht genug danken. Ich habe versucht, das für zwei Tage herauszufinden. –

4

Aus Gründen der Vollständigkeit, können Sie die Object zugreifen, indem Sie die DbContext zu IObjectContextAdapter Gießen:

((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.ChangeObjectState(user, EntityState.Modified); 

Morteza Methode ist viel sauberer und bekommt meine Stimme.

+0

Danke, ich dachte, ich hätte etwas offensichtlich übersehen. – kim3er

2

Ich glaube, dass Sie die Entität nicht anhängen müssen, bevor Sie geändert aufrufen. einfach die Einstellung auf "Modified" wird den Job erledigen.

if (_context.Entry(user).State == EntityState.Detached) 
{ 
    _context.Entry(user).State = EntityState.Modified; 
} 
Verwandte Themen