2011-01-06 7 views
0

Mein (Fluent) NHibernate Schema ist ein wenig kompliziert. Die beiden hier in Frage kommenden Klassen sind beide länderspezifisch und erben von einer abstrakten Klasse. Der Punkt dahinter ist, dass verschiedene Länderdaten in verschiedenen Tabellen gespeichert sind. Es funktioniert alles gut, außer im Folgenden. Diese HQL führt fein:Warum funktioniert meine HQL-Abfrage, aber eine Kriterienversion nicht?

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

(ich weiß, ich sollte SetParameter verwenden, aber das ist nur eine Demo). Allerdings sind diese Kriterien nicht:

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

mir gibt den Fehler:

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

Ich kann nicht für das Leben von mir, sehen, wo die Unterschiede liegen könnten. Kann jemand etwas sehen, das auf sie hinausspringt? Oder gibt es eine Möglichkeit, zugrundeliegende HQL von einem Kriterium (oder ähnlichem) zu bekommen, damit ich sie vergleichen kann?

Im Fall ist es keine Hilfe, ist mein seltsam-o-Mapping wie folgt:

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"); 
     } 
    } 
} 

Wie ich schon sagte, es funktioniert in jeder Hinsicht außer dieser Ordnung.

Antwort

0

Es scheint, dass eine Lösung, die ein Create hinzuzufügen ist, etwa so:

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

Allerdings würde ich sehr dankbar, wenn jemand irgendein Licht auf vergießen konnte, warum es notwendig ist.

Verwandte Themen