2011-01-06 7 views
0

My(Fluent)NHibernateスキーマは少し複雑です。ここで問題になっている2つのクラスは、どちらも国固有であり、抽象クラスを継承しています。その背景には、異なる国のデータが異なるテーブルに格納されているということがあります。以下を除いて、すべて正常に動作します。このHQLはうまく実行されます:HQLクエリは機能するが、Criteriaバージョンは機能しないのはなぜですか?

dbSession.CreateQuery(@"from DateBlock_US db where 
      db.HaveListing.City.LocationID = " + searchLocation.LocationID.ToString()).List<DateBlock>(); 

(私はSetParameterを使うべきですが、これはデモです)。しかし、この基準は動作しません:

dbSession.CreateCriteria(typeof(DateBlock_US)) 
      .Add(Restrictions.Eq("HaveListing.City.LocationID", searchLocation.LocationID)) 
      .List<DateBlock>(); 

の私にエラーを与える:違いがある可能性がありどこ私は、私の人生のために、見ることができない

could not resolve property: HaveListing.City.LocationID of: Dm.Mvc.Data.UserObjects.DateBlock_US 

。誰かが彼らに飛び出して何かを見ることができますか?あるいは、Criteria(または同様のもの)から基になるHQLを取得して比較する方法はありますか?

それは任意の助けだ場合には、以下のように、私の奇妙な-Oマッピングは次のとおりです。

public class Map<T> : NotNullableClassMap<T> where T : DateBlock 
    { 
     public void BaseMap() 
     { 
      Id(b => b.m_BlockCode).Column("BlockCode").GeneratedBy.GuidComb(); 
      Map(b => b.StartDate); 
      Map(b => b.EndDate); 
      Map(b => b.BlockType); 

     } 
    } 

public class DateBlock_US : DateBlock { 
    public class DateBlock_US_Map : Map<DateBlock_US> 
    { 
     public DateBlock_US_Map() 
     { 
      base.BaseMap(); 
      References<HaveListing_US>(b => b.HaveListing).Column("HaveListing_US_id"); 
     } 
    } 
} 

私はそれはこの1つを除いてあらゆる方法で正常に動作し、言ったように。

答えて

0

解決策がそうのように、CreateAliasを追加することであることが表示されます:

dbSession.CreateCriteria(typeof(DateBlock_US)) 
     .CreateAlias("HaveListing","h") 
     .Add(Restrictions.Eq("h.City.LocationID", searchLocation.LocationID)) 
     .List<DateBlock>(); 

ことが必要である理由誰もが上の任意の光を当てることができればしかし、私は非常に感謝されると思います。

関連する問題