【问题标题】:ASP.NET MVC -> WCF -> NHibernate, how to efficiently update entity with data from viewmodel?ASP.NET MVC -> WCF -> NHibernate,如何使用视图模型中的数据有效地更新实体?
【发布时间】:2010-12-29 15:46:33
【问题描述】:

一周前,我有一个 ASP.NET MVC 应用程序,它调用逻辑 POCO 服务层来针对实体执行业务逻辑。我常用的一种方法是使用 AutoMapper 将填充的视图模型映射到实体并在实体上调用更新(下面的伪代码)。

MyEntity myEntity = myService.GetEntity(param);

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

this.myService.UpdateEntity(myEntity);

更新调用将获取实体的实例,并通过存储库调用实体上的 NHibernate 的 Update 方法。

好吧,我最近将我的逻辑服务层更改为 WCF Web 服务。我注意到当实体从服务层发送到我的应用程序时,NHibernate 与实体建立的链接现在丢失了。当我尝试在更新方法中对实体进行操作时,NHibernate 的会话中出现了不应该出现的情况,反之亦然 - 它无法抱怨子标识符上的空值等。

所以我的问题...

如何有效地从填充的视图模型中获取输入并最终通过 NHibernate 修改对象?

  • 我是否可以使用 NHibernate 快速修复?
  • 是否应该采用不同的方法将更改从应用程序传递到服务层?

编辑:

我现在能想到的最好方法是创建一个新实体并从视图模型映射到新实体(包括标识符)。我会将它传递给服务层,在那里它将使用存储库检索实体,使用 AutoMapper 映射更改,并调用存储库的更新方法。我将映射两次,但它可能会起作用(尽管我必须在第二次映射中排除一堆属性/子项)。

【问题讨论】:

    标签: asp.net-mvc wcf nhibernate automapper


    【解决方案1】:

    没有快速修复。您已经遇到了通过电汇问题进行的更改跟踪。 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 发送状态更改信息可以读取或加载对象,应用更改,然后保存在您的服务层中。

    不要害怕在您的服务内部进行更新之前进行选择。无论如何,这是防止并发问题的好习惯。

    【讨论】:

      【解决方案2】:

      我不知道这是否是最好的方法,但我想通过 NHibernate 在 quick fix 上传递信息。

      来自 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>
      

      虽然我没有时间检查数据库调用以查看它是否完全符合我的预期,但它正在工作。

      【讨论】:

        猜你喜欢
        • 2012-06-11
        • 2012-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多