流畅的nHibernate - 将实体展平到ViewModel

时间:2014-02-05 15:54:35

标签: nhibernate fluent-nhibernate

我正在使用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; }
  }

我想使用下面的展平视图模型在网格中显示Person详细信息列表。 我是否必须为ViewModelPerson创建一个映射,即使它不是数据库表(Automapping会影响这个),还是应该使用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; }
  }

1 个答案:

答案 0 :(得分:1)

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

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

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

以上场景在一个视图中显示人员,地址和作业 - 是一个复杂的场景。我们能从分离,间接填充ViewModel中获益吗?

建议:使用对基础业务模型的查询

在服务层上填写ViewModel

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

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