2011-03-18 15 views
0

別のテーブルへの直接参照を持たないテーブルのマッピングを設定する方法はありますか?それは実際には別のテーブルからの参照を取得しますが、そこからの直接参照があります。流暢NHibernate - 分離テーブルマッピング

これは私がこれまで行ってきたことですが、私のメタデータモデルで "LookupValue"をどのようにマップするかはわかりません。 [mdd] .DefinitionTypeが[mdl] .LookupTypeに等しく、[md] .DataValueが[mdl] .LookupKeyに等しい場合は、MetaDataにマップする必要があります。

public class MetaData { 
    public virtual long TableID { get; set; } 
    public virtual MetaDataDefinition Definition { get; set; } 
    public virtual int DefinitionID { get; set; } 
    public virtual String DataValue { get; set; } 
    public virtual MetaDataLookup LookupValue { get; set; } 

    public override bool Equals(object obj) { ... } 
    public over int GetHashCode() { ... } 
} 

public class MetaDataDefinition { 
    public virtual long ID { get; set; } 
    public virtual string DefinitionName { get; set; } 
    public virtual string DefinitionType { get; set; } 
} 

public class MetaDataLookup { 
    public virtual string Type { get; set; } 
    public virtual string LookupKey { get; set; } 
    public virtual string LookupValue { get; set; } 

    public override bool Equals(object obj) { ... } 
    public over int GetHashCode() { ... } 
} 

public class MetaDataMap : ClassMap<MetaData> { 
    public MetaDataMap() { 
     Table("PPOMetaData"); 
     CompositeId() 
      .KeyProperty(x => x.TableID, "TableID") 
      .KeyProperty(x => x.DefinitionID, "DefinitionID"); 

     References(x => x.Defintion, "DefinitionID").Not.LazyLoad().Cascade.All().Fetch.Join(); 
     Map(x => x.TableID); 
     Map(x => x.DataValue); 
    } 
} 
public class MetaDataDefinitionMap : ClassMap<MetaDataDefinition> { 
    public MetaDataDefinitionMap() { 
     Table("MetaDataDefinitions"); 
     Id(x => x.ID); 
     Map(x => x.DefinitionName); 
     Map(x => x.Type); 
    } 
} 

public class MetaDataLookupMap : ClassMap<MetaDataLookup> { 
    public MetaDataLookupMap() { 
     CompositeId() 
      .KeyProperty(x => x.LookupType) 
      .KeyProperty(x => x.LookupKey); 
     Map(x => x.LookupValue); 
    } 
} 

理想的には、私はそれは次のようなクエリを実行したい:更新能力の面では

SELECT  data.TableID, data.DefinitionID, def.DefinitionName, data.DataValue,lu.LookupValue AS DataValue 
FROM   dbo.PPOMetadata AS data 
    INNER JOIN dbo.MetaDataDefinitions AS def ON def.ID = data.DefinitionID 
    LEFT OUTER JOIN dbo.MetaDataLookup AS lu ON lu.LookupType = def.Type AND lu.LookupKey = data.DataValue 
WHERE data.TableID = 1 

を、私が今まで作成、更新または削除でしょう唯一のことは、メタデータになります表。定義と参照値は決して変更されません(少なくともアプリケーションのこの部分から)。 "MetaDataLookup"を直接MetaDataモデルにマッピングできますか?もしそうなら、誰かが私が見ているべきものの正しい方向に向けることができますか?

ありがとうございます!

答えて

0

私はうまくいくと思われる回避策を考え出し、複雑さを取り除く可能性があります。 ClassMapで複雑な結合を処理するのではなく、Sql Serverでビューを作成してくれました。私のアプリケーションでは、ビューの新しいModelとClassMapを作成しました。私はまだ更新ロジックを実装していませんが、更新ロジックをMetaDataモデルで直接動作させ、読み込みロジック(すべてを結合する必要があります)は新しいMetaDataViewモデルを使用します。

Fluent NHibernateでこのような複雑な結合が可能であるのはまだ不思議ですが、今のところこの解決策は私のために働いているようです。