2011-07-01 7 views
1

NHibernateをかなり独特なレガシーデータベースに重ねるためにNHibernateを学習しています。他のアプリケーションでは同じライブデータベースを使用しているため、変更することはできません。2つの "プライマリ"キーを持つテーブル上のNHibernate

ハードウェアデバイスを表す1つのテーブルに事実上の主キーとして使用される2つの列があるため、問題が発生しました。 1つは実際の主キー、自動生成された行IDです。もう1つは、固有でヌル以外のハードウェアシリアル番号です。

データベース内の他の多くのテーブルには、このテーブルとの外部キー関係があります。しかし、それらのうちのいくつかは、実際の主キー(整数行ID)を外部キーとして使用し、一部は代わりにデバイスのハードウェアIDを使用します。

実際には、ハードウェアIDと行IDはペアになるとペアになります。

NHibernateでこれを処理するためのマッピングを作成できますか、より標準化されたスキーマを提供するためにいくつかのビューを作成し、INSTEAD OFトリガーを使用してそれらを更新可能にする必要がありますか?

使用しているDBは、これが異なる場合のMSSQL 2000です。

答えて

1

はあなたの状況では、私は次のようにします:主キーとして自動生成されたIDを使用して、あなたのHardwareDeviceクラスアウト

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 
} 

地図。 私の例では、クラスマップに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 
    } 
} 

クラスマップのプロパティ-REF機能を使用すると、従来のデータベースのこれらのタイプの主キーではない列に参加することができます目的。

関連する問題