2011-10-27 25 views
7

CompositeIdを使用して従来のシステムにマップしようとしています。ソースデータベースには複合主キーがあるため、通常のthis.Idマッピングは使用できません。ここで CompositeId原因マッピング文書のエラーをコンパイルできませんでした

は、それをマップする私の試みです:

public PriorityListPartMap() 
{ 
    this.Schema("EngSchedule"); 

    this.Table("vPriorityListPart"); 

    this.CompositeId().KeyProperty(x => x.AssemblyPartNumber).KeyProperty(x => x.PartNumber); 

    this.Map(x => x.CurrentDueDate); 

    this.Map(x => x.OrderLine); 

    this.Map(x => x.OrderNumber); 

    this.Map(x => x.PartDescription); 

    this.Map(x => x.ProductCode); 

    this.Map(x => x.Revision); 
} 

私はこのマッピングがエラー原因セッションファクトリを作成してみてください:(XmlDocumentオブジェクト)

私が試した: は、マッピング・ドキュメントをコンパイルできませんでしたがCompositeIdマッピングを削除して置き換えます。

this.Id(x => x.AssemblyPartNumber).GeneratedBy.Assigned(); 

エラーはそのマッピングで消えますが、私は実際にその罪を使用することはできませんAssemblyPartNumberは一意ではありません。

複合主キーを使用してテーブルにマップする別の方法はありますか?

おかげで、

マシューMacFarland

答えて

25

は ":(XmlDocumentオブジェクト)マッピング・ドキュメントをコンパイルできませんでした" ため、内部例外とは何ですか?私の理論は、 "composite-idクラスはEquals()をオーバーライドする必要があります:YOURNAMESPACE.PriorityListPart"です。

複合IDを必要とするエンティティでは、オブジェクト自体がキーとして使用されます。 '同じ'オブジェクトが認識されるようにするには、EqualsメソッドとGetHashCodeメソッドをオーバーライドする必要があります。

の例では、エンティティのための方法を等しいこのようなものになるだろう:

public override bool Equals(object obj) 
{ 
    var other = obj as PriorityListPart; 

    if (ReferenceEquals(null, other)) return false; 
    if (ReferenceEquals(this, other)) return true; 

    return this.AssemblyPartNumber == other.AssemblyPartNumber && 
     this.PartNumber == other.PartNumber; 
} 

あなたのエンティティの例GetHashCodeメソッドは、このようなものになるだろう:

public override int GetHashCode() 
{ 
    unchecked 
    { 
     int hash = GetType().GetHashCode(); 
     hash = (hash * 31)^AssemblyPartNumber.GetHashCode(); 
     hash = (hash * 31)^PartNumber.GetHashCode(); 

     return hash; 
    } 
} 

これはまた、もしあなたのことを意味しオブジェクトを取得したい場合、それを行うための単一のキーを持つことはできません。コンポジットキーコンポーネントで特定のオブジェクトを正しく取得するには、実際に使用するキーは、取得するエンティティにコンポジットキーコンポーネントを設定したオブジェクトのインスタンスです。

これは、Equalsメソッドをオーバーライドする必要があるため、NHibernateは、Equalsメソッドで指定した内容に基づいて、実際に取得しようとしているオブジェクトを特定することができます。

+0

これは**素晴らしい**です!完璧に働いた。私の元のエラーは内部例外を持たなかった、それはnullでしたが、あなたのソリューションはとにかく正しいです。あなたの助けをありがとう。 –

+0

完璧なソリューション - 私のために働く!私のエンティティは、Equalsなしでhttp://nmg.codeplex.com/によって作成されました。 – Henrik

関連する問題