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.
Czy w pierwszym kodzie
OdpowiedzUsuńcontext.Entry(customer).State = System.Data.EntityState.Unchanged;
nie powinno być czasem Added?
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ń