2012-04-05 106 views
1

我使用NHibernate 3.2.0與微軟SQL Server 2005數據庫,C#4.0和以下領域:NHibernate的查詢與<any>映射

public class Foo 
{ 
    public virtual Guid Id { get; set; } 
    public virtual IBar MyBar { get; set; } 
} 
public interface IBar 
{ 
    Guid Id { get; set; } 
} 
public class CocktailBar : IBar 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 
} 
public class ProgressBar : IBar 
{ 
    public virtual Guid Id { get; set; } 
    public virtual int Progress { get; set; } 
} 

和映射

<hibernate-mapping> 
    <class name="Foo" table="FOO"> 
    <id name="Id"> 
     <generator class="guid.comb"/> 
    </id> 
    <any name="MyBar" meta-type="System.Guid" id-type="System.Guid"> 
     <meta-value class="MyNamespace.CocktailBar" value="716B5C04-4115-47BF-BE8A-A3B34D3607FC"/> 
     <meta-value class="MyNamespace.ProgressBar" value="65412938-C2DE-48FF-9E90-009881DBDD4F"/> 
     <column name="TypeOfBarId"/> 
     <column name="BarObjectId"/> 
    </any> 
    </class> 
</hibernate-mapping> 

現在的我m試圖創建一個查詢,該查詢返回與名稱爲「Nightbar」的CocktailBar關聯的所有Foo對象。我如何創建這個查詢?在查詢中使用隱​​式多態(不管是HQL,Criteria還是QueryOver)都不包含在NHibernate Reference文檔中。

我試過如下:

Foo theFoo = session.QueryOver<Foo>() 
     .Where(c => c.MyBar.GetType().Name == "CocktailBar") 
     .JoinQueryOver<IBar>(c => c.MyBar) 
     .Where(c => ((CocktailBar)c).Name == "Nightbar") 
     .SingleOrDefault<Foo>(); 

,並得到了異常: 「System.InvalidOperationException:任何類型不具有唯一留存引用」 在NHibernate.Type.AnyType.GetAssociatedEntityName

回答

0
Foo theFoo = session.QueryOver<Foo>() 
    .Where(Restrictions.Eq("MyBar.class", typeOf(CocktailBar))) <-- here 
    .JoinQueryOver<IBar>(c => c.MyBar) 
    .Where(c => ((CocktailBar)c).Name == "Nightbar") 
    .SingleOrDefault<Foo>(); 
+0

這給了我一個InvalidCastException:無法從System.RuntimeType轉換爲System.String。即使在排除第3行和第4行時,錯誤仍然存​​在。 – MartinB 2012-04-10 09:17:44

+0

typeOf(CocktailBar).Name也許。我還沒有用過很多 – Firo 2012-04-10 09:22:39

+0

現在我得到一個KeyNotFoudnException。我不喜歡由NHibernate生成的SQL導致此錯誤:[SELECT this_.Id作爲Id0_0_,this_.TypeOfBarId作爲TypeOfBa2_0_0_,this_.BarObjectId作爲BarObjec3_0_0_從NHibernateTest.dbo.POLYTEST_FOO這this_ WHERE this_.TypeOfBarId =? ] 名稱:cp0 - 值:CocktailBar它嘗試比較數據庫中的字符串和Guid,而不使用元值翻譯字典。 – MartinB 2012-04-10 09:37:34