流畅的NHibernate非规范化视图映射

时间:2014-06-13 15:28:02

标签: fluent-nhibernate nhibernate-mapping

我有平面视图,我应该映射到2个单独的C#模型

class Container
{
   public virtual int Id {get;set;}
   public virtual string Title{get;set;}
   public virtual List<Item> Items{get;set;}
}

class Item
{
   public virtual string Code {get;set;}
   public virtual string Name {get;set;}
}

视图包含下一列:


ContainerId |标题|代码|名称

1 | 'title1'| 'code1'| 'NAME1'

1 | 'title1'| 'code2'| 'NAME2'

2 | 'title2'| 'code1'| 'NAME1'

...

如何执行此操作,以便能够进行以下查询:

session.Get<Container>(1)

=&GT; {Id = 1, Title = "title1", Items = [{Code="code1", Name = "name1"}, {Code="code2", Name= "name2"} ]}

我应该以某种方式将ContainerId映射为Id,但在视图中它不是唯一的,因为它被非规范化以包含多个。另外我应该在'Item'映射中映射一些Id - Item.Code可用于此。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您描述的两个实体在数据库中表示为两个单独的表,并且您还有一个基本上是这两个表的组合的视图,我会将它们映射为这样。因此,您拥有ContainerItem的实体地图,并且您还有一个&#34;实体&#34; (我称之为我的DAL中的视图对象)用于视图本身。

通常我会像这样映射数据库视图:

public class ContainerItemViewMap : ClassMap<ContainerItem>
{
    public ContainerItemViewMap()
    {
        Table("V_CONTAINER_ITEM");
        ReadOnly();
        Not.LazyLoad();
        SchemaAction.None();

        //Location mappings
        Id(x => x.ContainerId, "CONTAINER_ID");
        Map(x => x.Title);
        Map(x => x.Code);
        Map(x => x.Name);

    }
}

另外,在查看我的视图对象时,我将始终使用Stateless会话,因为对我来说,使用ISession这是没有意义的,因为你不会去对数据进行任何CUD(创建,更新,删除)操作。