我有平面视图,我应该映射到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可用于此。
谢谢!
答案 0 :(得分:0)
如果您描述的两个实体在数据库中表示为两个单独的表,并且您还有一个基本上是这两个表的组合的视图,我会将它们映射为这样。因此,您拥有Container
和Item
的实体地图,并且您还有一个&#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(创建,更新,删除)操作。