Ostatnio pracowałem z Entity Framework 4 i jestem nieco zdezorientowany, kiedy używać ObjectSet.Attach i ObjectSet.AddObject .
Z mojego zrozumienia:
- Użyj opcji „Dołącz”, gdy jednostka już istnieje w systemie
- Użyj „AddObject” podczas tworzenia zupełnie nowej jednostki
Tak więc, jeśli tworzę nową osobę , robię to.
var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
Jeśli modyfikuję istniejącą osobę , robię to:
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
Pamiętaj, że to bardzo prosty przykład. W rzeczywistości używam Pure POCO (bez generowania kodu), wzorca repozytorium (nie zajmuję się ctx.Persons) i jednostki pracy (nie zajmuję się ctx.SaveChanges). Ale „pod kołdrą”, powyższe dzieje się w mojej realizacji.
Teraz moje pytanie - nie znalazłem jeszcze scenariusza, w którym musiałem użyć Attach .
Czego tu brakuje? Kiedy musimy używać Attach?
EDYTOWAĆ
Aby wyjaśnić, szukam przykładów, kiedy używać Attach zamiast AddObject (lub odwrotnie).
EDYCJA 2
Poniższa odpowiedź jest poprawna (którą zaakceptowałem), ale pomyślałem, że dodam kolejny przykład, w którym Attach byłby przydatny.
W moim powyższym przykładzie dotyczącym modyfikowania istniejącej osoby faktycznie wykonywane są dwa zapytania.
Jeden do pobierania osoby (.SingleOrDefault), a drugi do wykonywania AKTUALIZACJI (.SaveChanges).
Jeśli (z jakiegoś powodu) już wiedziałem, że „Joe Bloggs” istnieje w systemie, po co dodatkowe zapytanie, aby go znaleźć? Mógłbym to zrobić:
var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();
Spowoduje to wykonanie tylko instrukcji UPDATE.