Jestem nowy dla nHibernate i staram się zorientować się we właściwy sposób, aby zaktualizować odłączone obiekty z formularza aplikacji POST. (Używamy ASP.NET MVC)Jaki jest właściwy sposób aktualizowania obiektu nhibernate z metody akcji POST ASP.net?
obiektu Próbuję zaktualizować zawiera (między innymi) IList obiektów podrzędnych, odwzorowane coś takiego:
<bag name="PlannedSlices" inverse="true" cascade="all-delete-orphan">
<key column="JobNumber" />
<one-to-many class="SliceClass" />
</bag>
Mamy zorganizowali Formularz edycji MVC, tak aby po wysłaniu z powrotem nasza metoda działania została przekazana jako przedmiot (włączając w to listę <> przedmiotów podrzędnych) Prawidłowo przesuniemy wszystkie identyfikatory podmiotów za pomocą formularza:
Nasza naiwna próba metoda post action wykonuje sesję.SaveOrUpdate (parentObject) z parentObject, który został skrobany z formularza widoku przez domyślny tryb Lbinder.
To wydaje się działać dobrze dla jednego z następujących scenariuszy:
- tworzenia nowego obiektu nadrzędnego
- Modyfikowanie właściwości jednostki dominującej
- Dodawanie nowych obiektów podrzędnych
- Modyfikacja istniejących obiektów podrzędnych (Patrząc na dzienniki nHibernate, widzę, że poprawnie ustalono, czy obiekty są nowe czy istniejące, i wydaje odpowiednie UPDATE lub INSERT)
Scenariusz, który zawodzi, to: - Usuwanie obiektów podrzędnych - tj. Jeśli nie znajdują się one w IList, nie są usuwane z bazy danych. Nie ma wyjątku ani niczego, po prostu nie są usuwane.
Rozumiem, że dzieje się tak dlatego, że magia, którą nHibernate wykonuje w celu utworzenia listy dzieci wymagających usunięcia, nie działa z odłączonymi instancjami.
Nie byłem w stanie znaleźć prostego przykładu tego, jak powinna wyglądać ta metoda działania za pomocą nHibernate (tj. Używając obiektu wiążącego model jako zdemontowanej instancji nHiblera) - przykłady oparte na MS EF (np. http://stephenwalther.com/blog/archive/2009/02/27/chapter-5-understanding-models.aspx) wydaje się używać metody "ApplyPropertyChanges", aby skopiować zmienione właściwości z obiektu powiązanego z modelem do ponownie załadowanej instancji obiektu.
Po tym wszystkim, pytanie jest dość proste - jeśli mam segregator modelu, który daje mi nowy obiekt, który zawiera kolekcje obiektów podrzędnych, jak mam to zaktualizować za pomocą nHibernate, (gdzie "aktualizacja" obejmuje prawdopodobnie usunięcie dzieci)?
Dziękuję bardzo za to - dużo pracy! Niestety, tym, z czym borykam się, jest to, że obiekt "Person", który mam w drugiej sesji/transakcji (tj. Mój POST) jest zupełnie nowym obiektem, który został stworzony przez ModelBinder, a nie pobranym obiektem, który miał zmodyfikowano kilka pól i wykonano kilka wywołań "delete child". Myślę, że to, czego szukam, to sposób na wzięcie tego nowego obiektu i zastosowanie jego zmian do pobranego obiektu, tak aby nh mógł następnie wyliczyć wymagany SQL. Może to po prostu nie istnieje. –
Sposób, w jaki mam do czynienia z tą sytuacją, traktuje nowy obiekt utworzony przez model spoiwa jako obiekt modelu prezentacji. Nadal będziesz musiał pobrać obiekt (lub w jakiś sposób utworzyć instancję klasy "utrwalonej"), który chcesz zaktualizować i zastosować te aktualizacje do tego obiektu. Następnie możesz zapisać ten obiekt w NHibernate. Czy to ma sens? –
Zatem "ręcznie" (tzn. Właściwość po obiekcie, z pętlami lub czymkolwiek innym w przypadku kolekcji podrzędnych), nadpisują właściwości "odzyskanego" obiektu właściwościami obiektu "prezentacja (tj. POST)"? I ręcznie obliczyć wymagane usunięcia dzieci? Wydaje się, że więcej pracy (i konserwacji!), Niż miałem nadzieję. Prawie nie wydaje się, że warto zajmować się modelarskim spinaczem, tak, jakbym miał do czynienia z polami jeden po drugim, równie dobrze mógłbym wyciągnąć je prosto z odpowiedzi formy. Dzięki za pomoc. –