1

私はNHibernateを学習して、かなり独特のレガシーデータベースの上に重ねています。他のアプリケーションは同じライブ データベースを使用するため、それらに影響を与える変更を行うことはできません。

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

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

実際には、ハードウェア ID と行 ID は、一度ペアになると、ペアのままであることに注意してください。

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

使用中の DB は MSSQL 2000 です。これにより違いが生じる場合があります。

4

1 に答える 1

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
}

AutoGenerated 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
    }
}

次に、他の2つのクラスをマッピングします。

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
    }
}

クラスマップのProperty-Ref機能を使用すると、これらのタイプのレガシーデータベースの目的の主キーではない列に参加できます。

于 2011-07-01T08:17:00.537 に答える