ASP.NET MVC -> WCF -> NHibernate, как эффективно обновить сущность с данными из viewmodel? - PullRequest
1 голос
/ 29 декабря 2010

Неделю назад у меня было приложение ASP.NET MVC, которое вызывало логический уровень обслуживания POCO для выполнения бизнес-логики в отношении сущностей. Один из подходов, который я обычно использовал, состоял в том, чтобы использовать AutoMapper для отображения заполненной модели представления на объект и вызывать обновление объекта (псевдокод ниже).

MyEntity myEntity = myService.GetEntity(param);

Mapper.CreateMap<MyEntityVM, MyEntity>();
Mapper.Map(myEntityVM, myEntity);

this.myService.UpdateEntity(myEntity);

Вызов update принимает экземпляр сущности и через репозиторий вызывает метод Update NHibernate для сущности.

Ну, я недавно изменил свой уровень логического сервиса на веб-сервисы WCF. Я заметил, что ссылка, которую NHibernate делает с сущностью, теперь теряется, когда сущность отправляется из сервисного уровня в мое приложение. Когда я пытаюсь работать с сущностью в методе обновления, в сеансе NHibernate происходит нечто, чего не должно быть, и наоборот - он не может жаловаться на пустые значения дочерних идентификаторов и т.

Итак, мой вопрос ...

Что я могу сделать, чтобы эффективно получить информацию от моей заполненной модели представления и в конечном итоге изменить объект через NHibernate?

  • Есть ли быстрое исправление, которое я могу применить с NHibernate?
  • Должен ли я использовать другой подход при передаче изменений из приложения на уровень обслуживания?

EDIT:

Лучший подход, о котором я могу подумать сейчас, - это создать новый объект и отобразить его из модели представления в новый объект (включая идентификатор). Я передам это на сервисный уровень, где он получит объект, используя хранилище, отобразит изменения, используя AutoMapper, и вызовет метод обновления хранилища. Я буду отображать дважды, но это может сработать (хотя мне придется исключить группу свойств / потомков во втором отображении).

Ответы [ 2 ]

1 голос
/ 29 декабря 2010

Я не знаю, является ли это лучшим подходом, но я хотел передать информацию о быстром исправлении с помощью NHibernate.

Из NHibernate.xml ...

<member name="M:NHibernate.ISession.SaveOrUpdateCopy(System.Object)">
    <summary>
    Copy the state of the given object onto the persistent object with the same
    identifier. If there is no persistent instance currently associated with 
    the session, it will be loaded. Return the persistent instance. If the 
    given instance is unsaved or does not exist in the database, save it and 
    return it as a newly persistent instance. Otherwise, the given instance
    does not become associated with the session.
    </summary>
    <param name="obj">a transient instance with state to be copied</param>
    <returns>an updated persistent instance</returns>
</member>

Это работает, хотя у меня не было времени, чтобы проверить вызовы базы данных, чтобы увидеть, делает ли он именно то, что я ожидаю.

1 голос
/ 29 декабря 2010

Нет быстрого решения.Вы столкнулись с проблемой отслеживания изменений.AFAIK NHibernate не имеет собственного способа справиться с этим.

Это может помочь:

https://forum.hibernate.org/viewtopic.php?f=25&t=989106

http://lunaverse.wordpress.com/2007/05/09/remoting-using-wcf-and-nhibernate/

В двух словах ваши два вариантадолжны настроить вашу службу так, чтобы она отправляла информацию об изменении состояния через Nhibernate, может считывать или загружать объекты, применять изменения и затем сохранять их на уровне службы.

Не бойтесь делать выбор перед обновлением внутриваш сервис.В любом случае, это хорошая практика для предотвращения проблем параллелизма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...