2009-05-19 36 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; } 
}