Актуализиране на обект с NHibernate в Asp.Net

Какъв е препоръчителният начин за актуализиране на обект? Досега измислих два начина:

  1. Просто създайте нов обект със съществуващия идентификатор и актуализирани стойности на свойствата и използвайте session.SaveOrUpdate()
  2. Използвайте DTO, извлечете съществуващия обект с помощта на session.Load(dto.Id), задайте нови стойности от dto, след което запазете.

No1 изисква много по-малко усилия, но понякога получавам изключение: „различен обект със същата стойност на идентификатор вече е свързан със сесията“. Има ли прост начин за това?

No2 може да изисква допълнително пътуване до DB, предполагам?

Съжалявам, ако вече е отговорено, просто не можах да намеря отговора.

Благодаря улу


person ulu    schedule 17.06.2009    source източник


Отговори (2)


Вашият втори вариант с DTO е предпочитаният от мен начин. Вашите DTO трябва да са специфични за екрана (Google Screen Bound DTO), така че екранът и вашият домейн да могат да се променят независимо един от друг.

Освен това няма да добави допълнително пътуване към db, тъй като # 1 ще изисква прекъснат обект, който ще трябва да бъде свързан отново (което задейства избор) след факта. Притеснението за един допълнителен избор също мирише силно на преждевременна оптимизация.

По отношение на конвертирането от домейн към DTO бих препоръчал да разгледате AutoMapper.

person Shane Courtrille    schedule 17.06.2009
comment
Благодаря Да, в момента обмислям AutoMapper. Опитвали ли сте някога да го използвате по друг начин -- dto към обект? - person ulu; 19.06.2009
comment
Не съм го правил, тъй като изисква .Net 3.5 и сме заседнали в 2.0, но съм чувал много добри неща за него, така че не бих се поколебал да го използвам, ако можех. - person Shane Courtrille; 23.06.2009

За да използвате №1, можете да опитате да изгоните обекта от сесията на nHibernates. Това ще премахне грешката за обекта, който вече е в сесията.

Бих препоръчал подход номер 2. Особено ако искате да добавите някакъв вид оптимистично заключване. В много случаи едно допълнително попадение в db няма да бъде толкова скъпо.

Редактиране

За да проверите дали даден обект вече съществува в сесията, можете да използвате метода Contains(obj) на екземпляра Session.

person JoshBerke    schedule 17.06.2009
comment
Благодаря за отговора! Мислех за Evict, но не можах да разбера как да проверя дали обект със същия ключ вече е там, така че в този момент решение №2 стана по-просто. Бих добавил и вашия отговор като правилен, но системата не ми позволява да маркирам повече от един отговор. - person ulu; 19.06.2009