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
这给了我一个InvalidCastException:无法从System.RuntimeType转换为System.String。即使在排除第3行和第4行时,错误仍然存在。 – MartinB 2012-04-10 09:17:44
typeOf(CocktailBar).Name也许。我还没有用过很多 – Firo 2012-04-10 09:22:39
现在我得到一个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