如何在Fluent-nHibernate查询中指定单个属性(鉴别器)的类型/类。

时间:2012-02-23 22:26:27

标签: c# nhibernate subclass fluent

我有一个场景,其中一个名为“Comment”的类引用了一个名为“Entity”的抽象类型。对于属性“Entity”,Fluent-ClassMap看起来非常类似于:

classMap.ReferencesAny(x => x.Entity)
   .EntityTypeColumn("DiscriminatorType")
   .EntityIdentifierColumn("DiscriminatorId")
   .IdentityType<int>()
   .AddMetaValue(typeof(Car), typeof(Car).Name);
   .AddMetaValue(typeof(House), typeof(House).Name);

正如您可能已经从上面的示例中发现的那样,“Entity”类由名为“House”的类和一个名为“Car”的类子类化。通过这种设置,只需执行以下操作即可检索特定“实体”的所有注释:Session.Query()。其中​​(m =&gt; m.Entity == myCarObject).ToList()。一切都像魅力一样。

这是简化的类结构:

abstract class Entity{}
class Car : Entity{}
class House : Entity{}

class Comment 
{ 
  public virtual Entity { get; set;}
}

但是,在一个用例中,我需要检索引用任何“Car”的所有“Comment”实例。换句话说,我正在努力实现以下目标:

var allCommentsOnCars1 = Session.Query<Comment>().Where(m => m.Entity is Car); //or
var allCommentsOnCars2 = Session.Query<Comment>().Where(m => m.Entity.GetType() == typeof(Car));

两个示例都不起作用(后者抛出GetType()未实现异常),但是无论如何都可以解决这个问题吗?我很可能通过创建两个单独的表来轻松清除我的问题:一个用于所有“汽车”评论以及一个用于所有“房屋”评论,但我不想在此时更改数据库结构和模型。

非常感谢您的反馈。

1 个答案:

答案 0 :(得分:-1)

可能不是最优雅的解决方案,但我通过简单地使用QueryOver()而不是Query()来解决问题。