2010-08-06 5 views
5

Ich versuche w/EF 4 CTP 4.Update-EF 4 Eigenschaft CTP 4 Freistehendes POCO

Meine Domain-Klasse wie folgt aussieht, eine freistehende POCO zu aktualisieren:

public class User { 
    public int Id { get; set; } 

    [Required, DisplayName("First Name")] 
    public string FirstName { get; set; } 

    [Required, DisplayName("Last Name")] 
    public string LastName { get; set; } 

    [ConcurrencyCheckAttribute, Timestamp] 
    public byte[] DataVersion { get; set; } 
} 

Im Repository ich habe folgende:

public void SaveUser(User user) { 
    if (user.Id > 0) { 
    dbContext.Users.Attach(user); 
    } 
    else { 
    dbContext.Users.Add(user); 
    } 
    dbContext.SaveChanges(); 
} 

dbContext erbt von DbContext.

Ich bin in der Lage, fügt gut, aber der Anhang funktioniert nicht. Ich laufe Sql Profiler, und keine SQL wird für das Update gesendet.

Antwort

6

Ich habe es herausgefunden ....

In der DbContext Klasse habe ich eine Methode, die die Einheit markiert als modifiziert.

public void MarkAsModified(object entity) { 
    base.ObjectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified); 
} 

Mein Repository Methode sieht nun wie folgt

public void SaveUser(User user) { 
    if (user.Id > 0) { 
    dbContext.Users.Attach(user); 
    dbContext.MarkAsModified(user); 
    } 
    else { 
    dbContext.Users.Add(user); 
    } 

    dbContext.SaveChanges(); 
} 
+0

hi. Ich habe jetzt lange gesucht nur für "Aktualisieren von detached Objekt in Linq" und beide Zeilen arbeiten jetzt 'db.UserProfileSet.Attach (Benutzer) '' db.ObjectStateManager.ChangeObjectState (User, EntityState.Modified) ' – Nasenbaer

2

Ich weiß, das im Grunde das Gleiche tut, aber was ich getan haben, ist in Ihrem Benutzer-Repository ein Verfahren GetForUpdate oder etwas ähnliches genannt : Dann

public User GetForUpdate(int id) 
{ 
    var u = new User(); 
    u.Id = id; 
    dbContext.Users.Attach(u); 
    return u; 
} 

, wenn Sie wollen "update" ein Benutzer mit einer bekannten ID:

var user = userRepo.GetForUpdate(id); 
user.Name = "John Doe"; 
user.Username = "john.doe"; 
userRepo.SaveUser(user); 

Wenn Sie den Benutzer anhängen und dann ändern, werden die Eigenschaften EntityState automatisch als Modified festgelegt.

HTH

+0

Gotcha , Danke für den Tipp. Das einzige Problem dabei ist, dass ich MVC verwende und die Modellbindung nutzen möchte. In meinem Beispiel müsste ich das repo.GetForUpdate, dann UpdateModel und dann Save aufrufen. Aber es ist gut zu wissen, dass es Alternativen gibt. – xxx

+0

Sorry, kann Ihre Frage nicht aufwerten (nicht genug rep) – xxx

+0

@xxx - Keine Sorge. – TheCloudlessSky

Verwandte Themen