2011-07-01 45 views
1

我在學習NHibernate的,以便在一個比較奇特的傳統數據庫層它的表。其他應用程序使用相同的實時數據庫,因此我無法進行會影響它們的更改。NHibernate的與兩個「主」鍵

我碰到一個問題,因爲一個表,它表示硬件設備,具有被用作事實上的主鍵兩列。一個是真正的主鍵,一個自動生成的行ID。另一個是唯一的非空硬件序列號。

許多數據庫中的其他表有這個表的外鍵關係。然而,他們中的一些使用真正的主鍵 - 整排ID - 作爲一個外鍵,以及一些使用該設備的硬件ID來代替。

注意,在實踐中,硬件ID和行ID,一旦配對,將保持配對。

能否在NHibernate中創建映射來處理這個問題,還是需要創建一些視圖來給我一個更標準的模式,並使用INSTEAD OF觸發器來使它們可更新?

的DB使用是MSSQL 2000年,在此情況下,有差別。

回答

1

在你情我願做到以下幾點:

public class HardwareDevice{ 
    public virtual int Id {get; set;} 
    public virtual string SerialNumber {get; set;} 
    //Other stuff 
} 

public class DomainThingA { 
    public virtual int Id {get; set;} 
    public virtual HardwareDevice Device {get; set;} 
    //Other stuff 
} 

public class DomainThingB { 
    public virtual int Id {get; set;} 
    public virtual HardwareDevice Device {get; set;} 
    //Other stuff 
} 

繪製出使用自動生成的ID作爲主鍵的HardwareDevice類。 我的例子使用FluentNhibernate來繪製類地圖。

public class HardwareDeviceMap : ClassMap<HardwareDevice> { 
    public HardwareDeviceMap(){ 
     Id(x=>x.Id).GeneratedBy.Native().Column("Id"); //Uses auto number 
     Map(x=>x.SerialNumber).Column("SerialNumber"); 
     //Other mappings 
    } 
} 

現在用於映射的其他兩個類:

public class DomainThingAMap : ClassMap<DomainThingA> { 
    public DomainThingAMap(){ 
     Id(x=>x.Id).GeneratedBy.Native(); //Uses auto number 
     References(x=>x.Device) 
      .Column("DeviceId"); //Joins on Id in HardwareDevice Table by default 
     //Other mappings 
    } 
} 

public class DomainThingBMap : ClassMap<DomainThingB> { 
    public DomainThingBMap(){ 
     Id(x=>x.Id).GeneratedBy.Native(); //Uses auto number 
     References(x=>x.Device) 
      .Column("SerialNumber") //Column in DomainThingB Table 
      .PropertyRef("SerialNumber"); //Joins using SerialNumber column (hardware device table) 
     //Other mappings 
    } 
} 

類圖的財產編號功能允許你加入哪個不是這些類型的傳統數據庫的主鍵列目的。