/ / obiekty deep clone używające EF6 - .net, entity-framework, entity-framework-6

obiekty deep clone używające EF6 - .net, entity-framework, entity-framework-6

Bardzo dużo się nad tym zastanawiałem i nadal nie znalazłem rozwiązania pozwalającego sklonować podmiot i móc go zapisać, w tym wszystkie poziomy relacji między dziećmi.

Czy ktoś wie, jak to zrobić?

BTW Mam to działa przy użyciu AsNoTracking () inastępnie za pomocą Include ("Child ..."), ale mam 5 poziomów relacji w mojej bazie danych i około 100 tabel, które należy uwzględnić, więc jestem po automatycznym sposobie wykonywania tego

Odpowiedzi:

0 dla odpowiedzi № 1

Próbowałem na 3 różne sposoby, z serializacją (nieużyteczne w większości przypadków z powodu luźnego obciążenia), implementując ICloneable na bazie jednostki z refleksją i używając niestandardowych atrybutów do kontrolowania zachowania Clone (myślę, że to szukasz) i implementacji ICloneable na każdej jednostce.

Właściwie wdrażam ICloneable na każdym pojedynczym obiekcie. Zwykle robię to:
1. MemberwiseClone ()
2. wywołać ICloneable.Clone powiązanych obiektów, aby wypełnić właściwości (tylko w przypadku niektórych właściwości
3. w niektórych innych powiązanych podmiotach wykonuję płytką kopię (w zależności od potrzeb)

Wiem, że to jest złe, ale z mojego doświadczenia, jeśli używam innych metod, gdy projekt zaczyna się Klon działa dobrze, ale po 6 miesiącach dzwoniąc do Clone na niektóre podmioty klonuje połowę bazy danych.

W twoim przypadku, przy aktywowanym leniwym obciążeniu, możesz użyć odbicia.
1. Zignoruj ​​prostą właściwość
2. wywołaj Clone dla każdej złożonej właściwości
3. wykonaj foreach na każdej właściwości ICollection, wywołując klon i dodając wynik do odpowiedniej listy

Problem w tym podejściu polega na tym, że taksklonuj całą bazę danych za każdym razem. Możesz zdecydować się na zatrzymanie na niektórych jednostkach nadpisujących Klon lub używanie niestandardowych atrybutów na właściwościach, ale potrzebujesz czegoś, aby uniknąć klonowania całego DB.

Jeśli nie aktywujesz leniwego obciążenia, istnieją metody, które możesz wywołać przed klonowaniem.

context.Entry(myEntry).Reference("myRefProp").Load();
context.Entry(myEntry).Collection("myColl").Load();

ale nie rozwiązują twojego problemu.

EDYTOWAĆ
Nadal mam kod do zastosowania tej metody (zatrybuty), nie używam go od wieków, ale jeśli potrzebujesz, mogę go gdzieś zamieścić. Właściwie wdrażam zawsze ICloneable na każdej jednostce, ponieważ użycie atrybutów do zatrzymania serializacji lub zatrzymanie jej w implementacji Clone lepiej zatrzymuje ją w implementacji Clone.