2009-05-19 33 views
9

我有一个表的结构是这样的功能NHibernate - 地图2表一类

table Employees 
EmployeeID 
EmployeeLogin 
EmployeeCustID 

table Customers 
CustomerID 
CustomerName 

我想什么是地图上方的一个单独的类结构命名为:

Class Employee 
EmployeeID 
EmployeeLogin 
EmployeeName 

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

回答

4

我不知道是否有可能与流畅,但在XML中使用的接合元件:

简化:

<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

+0

嗨,你是对的,你可以做客户表中的连接,但我想以相反的方式做。 然而,使用Employees表并加入Customers表会导致无法加入正确的ID,因为customers表没有外键。 – 2009-05-19 15:08:41

+0

为什么你想要做不同?有关系吗?这只是这种映射方式。你不会在课堂和表格中看到这一点。所以呢? – 2009-05-19 15:19:39

+6

在Fluent中你会使用WithTable(“2ndTableName”,m => {/ *第二个表映射* /); – 2009-05-19 20:40:33

0

EmployeeCustID是否唯一?如果没有,那么这是永远不会起作用的,因为你然后尝试将两种不同的实体类型塞入到1中。同样,在你的结构中,你想如何保存一个实例? - >客户ID是未知的,所以你不能保存这样一个实体。 (我假设)EmployeeCustID用于将客户实体链接到员工实体(如果员工也是客户),这意味着“客户”是只是一个员工的角色,因此是可选的和可变的,因此应该是一个单独的实体。

1

我没有试过因为流利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

我同意上述弗兰斯但如果你坚持用别人的代码,并且使用现有的结构,你可以可以使用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; } 
}