【问题标题】:NHibernate Query with <any> mapping带有 <any> 映射的 NHibernate 查询
【发布时间】:2012-04-05 10:06:36
【问题描述】:

我将 NHibernate 3.2.0 与 Microsoft SQL Server 2005 数据库、C# 4.0 和以下域一起使用:

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>

现在我正在尝试创建一个查询,该查询返回与名为“Nightbar”的 CocktailBar 关联的所有 Foo 对象。如何创建此查询? NHibernate 参考文档中没有介绍在查询中使用隐​​式多态性(无论是 HQL、Criteria 还是 QueryOver)。

我尝试了以下方法:

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>();

在 NHibernate.Type.AnyType.GetAssociatedEntityName 中得到了异常:“System.InvalidOperationException:任何类型都没有唯一引用的持久化器”

【问题讨论】:

    标签: c# nhibernate nhibernate-mapping queryover any


    【解决方案1】:
    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>();
    

    【讨论】:

    • 这给了我一个 InvalidCastException:无法从 System.RuntimeType 转换为 System.String。即使省略第 3 行和第 4 行,错误仍然存​​在。
    • typeOf(CocktailBar).Name 也许。这个我用的不多
    • 现在我得到一个 KeyNotFoudnException。我不喜欢 NHibernate 生成的导致此错误的 SQL: [ SELECT this_.Id as Id0_0_, this_.TypeOfBarId as TypeOfBa2_0_0_, this_.BarObjectId as BarObjec3_0_0_ FROM NHibernateTest.dbo.POLYTEST_FOO this_ WHERE this_.TypeOfBarId = ? ] Name:cp0 - Value:CocktailBar 它试图比较一个字符串和数据库中的 Guid,而不是使用元值翻译字典。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2011-06-13
    相关资源
    最近更新 更多