środa, 28 listopada 2012

O czym pamiętać przy zmianie stanu encji w EF

Manipulując stanem encji, należy pamiętać o dwóch zasadach. Dotyczą one zapisu zmian do bazy danych po zakończeniu pracy z obiektami i ustawianiu im stanów.

W przypadku użycia metod:
  • Add
  • DbContext.Entry(obj).State = EntityState.Added
jeżeli obiekt zawiera referencje do innych obiektów, zostaną one także dołączone do kontekstu i przy wywołaniu metody SaveChanges() zapisane do bazy. Przykład:

Code:
            using (var context = new AdventureWorksLTEntities())
            {
                var customer = new Customer { FirstName = "Jacek", LastName = "Kowalski" };
                customer.CustomerAddresses.Add(new CustomerAddress 
                { Address = new Address { AddressLine1 = "Ulica Polkowa", PostalCode = "45-123" } });
                context.Entry(customer).State = System.Data.EntityState.Added;
                context.SaveChanges();
            }

zarówno obiekt klasy Customer, jak i CustomerAddresses oraz Address zostaną zapisane do bazy.

Przeciwieństwem powyższego zachowania jest przyczepienie obiektu, który istnieje już w bazie danych do kontekstu, czyli użycie metody:
  • Attach
  •  DbContext.Entry(obj).State = EntityState.Unchanged
  •  DbContext.Entry(obj).State = EntityState.Modified

Code:
            var customer = GetCustomerFromRepository();
            using (var context = new AdventureWorksLTEntities())
            {
                customer.CustomerAddresses.Add(new CustomerAddress 
                { Address = new Address { AddressLine1 = "Ulica Polkowa", PostalCode = "45-123" } });
                context.Entry(customer).State = System.Data.EntityState.Unchanged;
                context.SaveChanges();
            }

Powyższy przypadek nie spowoduje dodania nowych obiektów klas CustomerAddresses oraz Address do bazy danych.

2 komentarze:

  1. Czy w pierwszym kodzie
    context.Entry(customer).State = System.Data.EntityState.Unchanged;
    nie powinno być czasem Added?

    OdpowiedzUsuń
    Odpowiedzi
    1. Dzięki za komentarz - tak ma być Added, testowałem różne opcje i pewnie skopiowałem którąś z błędnych. W każdym razie poprawione.

      Usuń