środa, 28 listopada 2012

Entity Framework - Graph Object State

Encja pobrana z bazy za pomocą EntityFramework może mieć jeden z następujących stanów:
  • Added - encja jest śledzona przez kontekst, ale nie istnieje w bazie danych
  • Unchanged - encja jest śledzona przez kontekst oraz istnieje w bazie danych. Wartości pól są takie same w bazie jak i obiekcie (nie dokonano żadnych zmian).
  • Modified - encja jest śledzona przez kontekst, istnieje w bazie danych. Dokonano zmian w jej polach
  • Deleted - encja jest śledzona przez kontekst i istnieje w bazie danych. Została jednak oznaczona do usunięcia. Przy następnym wywołaniu SaveChanges zostanie usunięta z bazy danych
  • Detached - encja nie jest śledzona przez kontekst

Standardowe operacje w przypadku Encji w odniesieniu do jej stanu:

Dodawanie encji do kontekstu:
Dodawać można na jeden z trzech sposobów:
za pomocą metody Add

Code:
            using (var context = new AdventureWorksLTEntities())
            {
                var customer = new Customer {FirstName = "Jacek", LastName = "Kowalski"};
                context.Customers.Add(customer);
                context.SaveChanges();
            }

zmieniając stan encji na Added:

Code:
            using (var context = new AdventureWorksLTEntities())
            {
                var customer = new Customer {FirstName = "Jacek", LastName = "Kowalski"};
                context.Entry(customer).State = System.Data.EntityState.Added;
                context.SaveChanges();
            }

trzecia możliwość to dodanie do kolekcji pobranych elementów, np. klient może mieć wiele zamówień, chcemy dodać kolejne - możemy postąpić następująco:

Code:
            using (var context = new AdventureWorksLTEntities())
            {
                var salesOrders = context.Customers.First().SalesOrderHeaders;
                salesOrders.Add(new SalesOrderHeader { AccountNumber = "1111111111111", DueDate = DateTime.Now, SubTotal = 100 });
                context.SaveChanges();
            }

W każdym przypadku, jeżeli dodawana encja posiada referencje do innych encji, zostaną one także dodane do bazy danych podczas wywoływania SaveChanges - chyba że już są zapisane te dane w bazie danych.


Dołączanie encji do kontekstu
Jeżeli mamy encję, która istnieje w bazie danych, ale z jakichś powodów została odłączona od kontekstu (np. została wysłana przez klienta w n-warstwowej aplikacji), wtedy taką encję możemy dołączyć do kontekstu za pomocą metody Attach:

Code:
            var customer = GetCustomerFromRepository();
            using (var context = new AdventureWorksLTEntities())
            {
                context.Customers.Attach(customer);
                context.SaveChanges();
            }

Encja zostanie dodana ze stanem Unchanged, a wywołanie metody SaveChanges w tym przypadku nie będzie mieć żadnych konsekwencji na bazie danych.
Innym sposobem dodania istniejącej encji w bazie do kontekstu jest zmiana jej stanu na Unchanged:

Code:
            var customer = GetCustomerFromRepository();
            using (var context = new AdventureWorksLTEntities())
            {
                context.Entry(customer).State = System.Data.EntityState.Unchanged;
                context.SaveChanges();
            }

Brak komentarzy:

Prześlij komentarz