使用包含分支ID和分支名称的数据库表“Employees”在具有Employee和Branch实体的网站上工作。我无法更改客户端的数据库,因此我需要从同一个表中映射Employees和Branches。
我想我需要在映射XML中使用某种类型的distinct子句来从employee表中获取一个不同的列表或一组分支?
有没有办法可以在同一个表上映射这两个类? (可以用Fluent NHibernate完成吗?)
答案 0 :(得分:2)
Stefan是正确的,使用组件。在FluentNHibernate中,它看起来像:
class Branch
{
string Name { get; set; }
DateTime DateOpened { get; set; }
}
class Employee
{
int Id { get; set; }
string Name { get; set; }
Branch Branch { get; set; }
}
class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
Id(x => x.Id);
Map(x => x.Name);
Component<Branch>(x => x.Branch, c => {
c.Map(x => x.Name);
c.Map(x => x.DateOpened);
});
}
}
Component<Branch>
可以缩短为Component
,因为编译器会自动计算出类型。另外,我喜欢做的是在我的组件的类上提供AsComponent
函数,所以我不必在映射组件的每个地方重复自己:
public static class BranchMap
{
public Action<ComponentPart<Branch>> AsComponent()
{
return c =>
{
c.Map(x => x.Name);
c.Map(x => x.DateOpened);
};
}
}
对于实体可能具有多个具有不同命名方案的组件实例的情况,这也可以很容易地添加前缀/后缀函数。
答案 1 :(得分:1)
使用组件。我不知道FluentNhibernate,但在xml中,它看起来像这样:
<class name="Employee">
...
<component name="MyBranch">
<!-- Branche properties are here: -->
<property name="BrancheName"/>
<property name="..."/>
</component>
</class>
class Employee
{
Branch MyBranch { get; private set; }
}
class Branch
{
string BrancheName { get; private set; }
}
实际上非常简单。出于性能原因,您也是这样做的,因为当员工总是有分支时,您不需要连接表。
注意:如果所有列都为null,则myBranch将为null。