2012-03-15 12 views
2

私は、特定のテーブルを参照するIDを含む3列のテーブルを持っている状況があります。これらの3つの列に加えて、私はいくつかのプロパティを持ついくつかの列を持っています。NHibernateにヌル値を含む複合ID

3つの列がFoo、Bar、Bazであるとします。 Fooはnullではなく、Bar、Bazのいずれか1つがnullです。

私のエンティティとのマッピングは、(私は物事をシンプルに保つために望んでいたことを覚えておいてください)次のようになります。

public class FooBarBaz 
{ 
    public virtual Foo Foo { get; set; } 
    public virtual Bar Bar { get; set; } 
    public virtual Baz Baz { get; set; } 
    public virtual string Prop { get; set; } 

    public override bool Equals(Object obj) 
    { 
     /* checks for nulls etc. in the end 
     returns Foo == obj.Foo && Bar == obj.Bar && Baz == obj.Baz */ 
    } 

    public override int GetHashCode() 
    { 
     /* builds unique string for (Foo,Bar,Baz) 
     taking nulls into account and gets it's hashcode */ 
    } 
} 

public class FooBarBazMap : ClassMap<FooBarBaz> 
{ 
    public FooBarBazMap() 
    { 
     CompositeId() 
      .KeyReference(x => x.Foo, "Foo_Id") 
      .KeyReference(x => x.Bar, "Bar_Id") 
      .KeyReference(x => x.Baz, "Baz_Id"); 
     Map(x => x.Prop); 
    } 
} 

は、私は手動ですべての3つの列がNULLでない行を作成し、このマッピングは完全に動作します良い。しかし、私のアプリケーションロジックは、2つのうちの1つ(Bar、Baz)がnullであるという事実に基づいており、その状況では、NHibernateはFooBarBazエンティティとしてnullを返します。

どうすればこの問題を解決できますか? NHibernateはCompositeIdでnull値を許可しますか?

答えて

2

nhibernateはリレーショナルデータベースの上に抽象化されており、リレーショナルデータベースは主キー列にnull値を許可しません(実際にはすべてのpk列にnull制約はありません)。

このテーブルを3つのエンティティ間のリンクテーブルとし、これをコンポーネントとしてマップします。 Foo barとbazの間の関連付けを投稿すれば、私は例を挙げることができます。

+0

私はこれらの列がプライマリキーであるとは言いませんでした。 – szymzet

+3

しかし、compositeidとしてマップすると、nhはそれを考え、dbと同じように動作します。あなたの質問に答えてください:いいえ。 – Firo

関連する問題