【问题标题】:Fluent nHibernate - Flatten Entities to ViewModelFluent nHibernate - 将实体展平为 ViewModel
【发布时间】:2014-02-05 15:54:35
【问题描述】:

我正在使用 FluentNHibernate 和 AutoMapping 和约定来创建我的数据库。 我有 3 个表 - 人员、地址和工作,如下所示。

    //Database table
  public class Person()
  {
    public virtual int Id { get; set; }
    public virtual string FirestName { get; set; }
    public virtual string SecondName { get; set; }

    public virtual PersonAddress Address { get; set; }
    public virtual PersonJob Job { get; set; }
  }

  //Database table
  public class PersonAddress()
  {
    public virtual int Id { get; set; }
    public virtual string AddressLine1 { get; set; }
    public virtual string AddressLine2 { get; set; }
    public virtual string AddressLine3 { get; set; }
  }

  //Database table
  public class PersonJob()
  {
    public virtual int Id { get; set; }
    public virtual int Description { get; set; }
  }

我想使用下面的平面视图模型在网格中显示人员详细信息列表。 我是否必须为 ViewModelPerson 创建一个映射,即使它不是数据库表(自动映射会影响这一点)还是应该使用 nHibernate 查询来创建获取 ViewModelPerson 实体的列表。

  //NOT database table - only used as ViewModel
  public class ViewModelPerson()
  {
    public virtual int PersonId { get; set; }
    public virtual string FirestName { get; set; }
    public virtual string SecondName { get; set; }

    //AddressLine1 + AddressLine2 + AddressLine3
    public virtual int AddressId { get; set; }
    public virtual string Address { get; set; }

    public virtual int JobId { get; set; }
    public virtual string Job { get; set; }
  }

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

    让我告诉你我的观点,我相信的方法......

    数据层 - 映射 Entity vs Table 是与数据层相关的。这只是一种方式,以后如何从像 NHibernate 这样的 ORM 工具中获利。所有的 CRUD 操作都是为我们生成的 - 反映了映射。

    表示层 - ViewModel,应该帮助我们“映射” Entity(-ies) Client View。因此,虽然在许多简单场景中:Entity、Table、ViewModel .. (例如 CountryCurrency 匹配 1-1,但我们已准备好在更复杂的场景中以不同方式处理它。

    上述场景在一个视图中显示人员、地址、工作 - 是一个复杂的场景。我们可以从ViewModel 的分离、间接填充中获利吗?

    建议:使用对底层业务模型的查询在服务层上填充ViewModel

    我看到的第一个好处是,ViewModelPerson人口掌握在我们手中。它在映射内部不是固定的。我们可以减少数据量(甚至使用 Projections 来加载更少的数据),我们甚至可以扩展它(从某个 CodeList 加载 City)

    第二个好处是,如果我们需要改变某些东西,例如引入 Addresses 的异步加载,我们必须仅更改它从服务层 UP(在 MVC 控制器、模型和视图中)而数据层(未触及映射)

    【讨论】:

    • 感谢您的回复 - 我打算在服务层上填充 ViewModel 我只是不确定什么是最好的查询或方法。我已经使用普通的 nHibernate 查询完成了它,然后使用 AutoMapper 从查询结果中填充了我的 ViewModel。理想情况下,我喜欢使用 Projections,但我没有使用它们的经验,而且查询对我来说有点复杂。例如,在 ViewModel 中连接 Address 是有问题的。
    • 我明白了。但是对于 NHibernate,没有其他选择,那就试试吧,学习吧;)这些是我可以给你的最好的链接,让你开始实验 (见下文)。一旦您开始使用查询、预测、转换器 - 不要犹豫,在这里提问,我相信您会得到帮助。所以:15。标准查询 - nhforge.org/doc/nh/en/index.html#querycriteria 甚至更多类型安全16。 QueryOver 查询 nhforge.org/doc/nh/en/index.html#queryqueryover。还要检查这个 19.1.5。使用批量抓取 nhforge.org/doc/nh/en/index.html#performance-fetching-batch
    • 我的意思是,如果您有疑问但不知道如何继续,您肯定会在这里获得帮助......一般教程很可能超出了这里的范围。我想你知道我的意思。您可以查看stackoverflow.com/a/20970816/1679310stackoverflow.com/a/19287008/1679310 以及此问答,了解stackoverflow.com/questions/20528760 的查询能力
    猜你喜欢
    • 2015-06-20
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多