1

Microsoft SQL Server 2005 データベース、C# 4.0、および次のドメインで NHibernate 3.2.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 オブジェクトを返すクエリを作成しようとしています。このクエリを作成するにはどうすればよいですか? クエリ (HQL、Criteria、QueryOver など) での暗黙的なポリモーフィズムの使用については、NHibernate リファレンス ドキュメントでは説明されていません。

私は次のことを試しました:

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 : どの型にも一意に参照された永続化機能がありません」

4

1 に答える 1

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>();
于 2012-04-07T11:45:35.350 に答える