我正在使用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; }
}
答案 0 :(得分:1)
让我告诉你我的观点,我相信的方法......
数据层 - 映射 Entity
vs Table
是与数据层相关的。这只是一种方式,如何从NHibernate等ORM工具中获利。所有CRUD操作都是为我们生成的 - 反映了映射。
表示层 - ViewModel
,应该帮助我们“映射” Entity(-ies)
到 Client View
。因此,虽然在许多简单的场景中:实体,表,ViewModel .. (例如Country
或Currency
)匹配1-1,我们已准备好以更多方式处理它复杂的情景。
以上场景在一个视图中显示人员,地址和作业 - 是一个复杂的场景。我们能从分离,间接填充ViewModel
中获益吗?
建议:使用对基础业务模型的查询
在服务层上填写ViewModel
我看到的第一个好处是ViewModelPerson
的人口掌握在我们手中。它没有固定在映射中。我们可以减少数据量(甚至使用Projections加载更少的数据)我们甚至可以扩展它(从某些CodeList加载City)
第二个好处是,如果我们需要更改某些内容,例如引入Addresses
的异步加载,我们必须从服务层UP(在MVC控制器,模型和视图中)仅更改,而数据层(映射未被触及)