流畅的NHibernate - 将2个表映射到一个类

时间:2009-05-19 06:03:11

标签: fluent-nhibernate

我有一个像这样的表结构

table Employees
 EmployeeID
 EmployeeLogin
 EmployeeCustID

table Customers
 CustomerID
 CustomerName

我想要的是将上面的结构映射到一个名为:

的单个类
Class Employee
 EmployeeID
 EmployeeLogin
 EmployeeName

我如何用流利的nhibernate做到这一点?

4 个答案:

答案 0 :(得分:4)

我不知道是否可以使用流利,但在xml中你使用了join元素:

简化为:

<class name="Employee" table="Customers" >
  <id name="CustomerID" .../>

  <property name="CustomerName"/>

  <join table="Employees">
    <key column="EmployeeCustID" />
    <property name="EmployeeLogin" />
  </join>

</class>

请参阅此post by Ayende

答案 1 :(得分:3)

我同意上面的Frans,但如果您遇到其他人的代码并且必须使用现有结构,则可以使用WithTable。

public class EmployeesMap : ClassMap<Employees>
{
    public EmployeesMap()
    {
        Id(x => x.EmployeeId);
        Map(x => x.EmployeeLogin);

        WithTable("Customers", join =>
            {
                join.Map(m => m.EmployeeName, "CustomerName");
                join.WithKeyColumn("EmployeeCustID");
            });
    }
}

[DataContract(IsReference = true)]
public class Employees
{
    [DataMember]
    public virtual int EmployeeId { get; set; }

    [DataMember]
    public virtual string EmployeeLogin { get; set; }

    [DataMember]
    public virtual string EmployeeName { get; set; }
}

答案 2 :(得分:1)

我没有试过这个,因为Fluent NHibernate转到1.0所以我的语法可能不正确。我很确定这只有在Customer.CustomerIdEmployee的外键时才有效。

public class EmployeeMap : ClassMap<Employee>
{
  public EmployeeMap()
  {
    Id(x => x.EmployeeId);
    Map(x => x.EmployeeLogin);

    Table("Customer", m =>
    {
      m.Map(x => x.EmployeeName, "CustomerName");
    });
  }
}

答案 3 :(得分:0)

EmployeeCustID是唯一的吗?如果没有,这将永远不会起作用,因为您尝试将两种不同的实体类型填充到1.另外,对于您的结构,您希望如何保存实例? - &GT; CustomerID未知,因此您无法保存此类实体。

恕我直言,最好简单地将客户作为员工的相关实体,因为(我假设)如果员工也是客户,则EmployeeCustID用于将客户实体链接到员工实体,这意味着'客户'只是员工的角色,因此是可选的和可变的,因此应该是一个单独的实体。