2009-11-11 12 views
12

Mam niektóre dane pochodzące z innych poziomów i reprezentują obiekt EF. Gdy jest nowy, to zrobić:aktualizacja odłączonego obiektu w strukturze jednostki

context.AddToCustomer(mynewobject); 
context.SaveChanges(); 

ale teraz moje dane tworzy istniejący obiekt, więc chcę kontekst wiedzieć chcę zaktualizować dane i nie wkładając ją.

Widziałem "ApplyPropertyChanges", ale nie mogę dowiedzieć się, jak z niego korzystać. Ja również widziałem ludzi w ten sposób:

Customer existingOne = (from n in context.Customers 
         where n.id = mynewobject.id select n).First() 
existingOne.name = mynewobject.name 
existingOne.address= mynewobject.address 
context.SaveChanges(); 

ale to wydaje się trochę dziwne, bo trzeba ręcznie ustawić wszystkie rekwizyty i najpierw przeczytać cały obiekt.

Odpowiedz

4

Podczas gdy pytam, czy warto nawet "zoptymalizować" aktualizację, można jednak wykonać to, o co prosisz. It's easier in EF 4, ale także possible in EF 1. Zobacz także this article.

public static void AttachAsModified<T>(this ObjectSet<T> objectSet, T entity) where T : class 
{ 
    objectSet.Attach(entity); 
    objectSet.Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified); 
} 
+1

Trzeba dodać, że EF1 jest nieco bardziej skomplikowane, gdy chce się coś zmienić r właściwości, a następnie skalar (jak będzie można zobaczyć w sekcji "Ostrzeżenia" w artykule "Możliwe w EF1"). Możesz znaleźć obejście tego między odpowiedziami na to pytanie http://stackoverflow.com/questions/1612655/entity-framework-updating-w-related-entity –

+0

Dziękuję bardzo za odpowiedź. Czasami trzeba to zobaczyć, żeby w to uwierzyć. Nie mogłem sam tego wymyślić, rozwiązanie "możliwe w EF 1". – Michel

0

Jest na mojego post wykonać tę

0

Zrobione z Employee Info Starter Kit, można rozważyć fragment kodu jak poniżej:

public void UpdateEmployee(Employee updatedEmployee) 
     { 
      //attaching and making ready for parsistance 
      if (updatedEmployee.EntityState == EntityState.Detached) 
       _DatabaseContext.Employees.Attach(updatedEmployee); 
      _DatabaseContext.ObjectStateManager.ChangeObjectState(updatedEmployee, System.Data.EntityState.Modified); 
      _DatabaseContext.SaveChanges(); 
     } 
8

W Entity Framework 5 to jak idziesz na temat :

 /// <summary> 
     /// Updates an entity 
     /// </summary> 
     /// <param name="input">A entity</param> 
     /// <returns>The updated object</returns> 
     public TEntity Update(TEntity input) 
     { 
      using (var context = GetContext()) 
      { 
       context.Set<TEntity>().Attach(input); 

       var entry = context.ChangeTracker.Entries<TEntity>().FirstOrDefault(e => e.Entity == input); 
       if (entry != null) 
        entry.State = EntityState.Modified; 

       context.SaveChanges(); 
      } 

      return input; 
     } 
Powiązane problemy