Zacząłem tworzyć dostęp do bazy przez LINQ to SQL. W obiekcie LINQ to SQL Classes dodałem wszystkie tabele powiązane ze sobą wokol tabeli/klasy Pracownika, tzn. Pracownik, DzialFirmy, StanowiskoPracy, Haslo.
Taki wycinek bazy danych służy jako DataContext w repozytorium PracownikiRepository, wydawalo mi sie to wygodniejsze do pozyskiwania NazwDziałów, NazwStanowisk bezpośrednio z obiektu Pracownik. Bo zmapowana klasa Pracownika zawiera teraz nie tylko pola int z numerami id pół: DziałFirmy, StanowiskoPracy i Haslo ale tez zawiera pole typu tych obiektów i ma te obiekty w sobie.
I dopóki korzystałem z repozytorium tylko odczytując dane z bazy to było wygodne ale problem wystąpił w chwili gdy chciałem dodać nowego pracownika. Wyskoczył wyjątek:
An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext. This is not supported.
doczytałem że chodzi tu o to że dodając nowego Pracownika kompilator "widzi" ze obiekt Pracownik zawiera podobiekty DzialFrimy, StanowiskoPracy itp i czepia się ich że ja chce je dodać jako nowe a one już istnieją w bazie. Tak jakby metoda:
public void Add(Pracownik entity)
{
db.Pracownicy().InsertOnSubmit(entity);
db.SubmitChanges();
}
nie chiała dodac jako nowy tylko Pracownik entity ale i jego podobiekty również jako nowe.
I teraz pytanie:
Czy 1 obiekt LINQ to SQL classes ma zawierać tylko jedną tabele? Wtedy dodając nowego pracownika operuje tylko na numerach id jego ewentualnych podobiektow a nie na całych podobiektach? Czy to normalne ze wtedy w jednym presenterze bede mial tyle repozytoriow z ilu tabel bede korzystal w danym oknie? Np. Takie okno AddEditPracownik gdzie wpisuje dane nowego albo edytuje istniejącego pracownika bedzie zawieral repozytoria: Pracownik, Dzialfirmy, StanowiskoPracy itd, zeby wyswietlic np. nazwe dzialu do jakiego przypisac nowego pracownika.