【问题标题】:How to specify the type/class of a single property (discriminator) in a Fluent-nHibernate query.如何在 Fluent-nHibernate 查询中指定单个属性(鉴别器)的类型/类。
【发布时间】:2012-02-23 22:26:27
【问题描述】:

我有一个场景,一个名为“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”类的子类。使用此设置,只需执行以下操作即可检索特定“实体”的所有 cmets 相当简单:Session.Query().Where(m => m.Entity == myCarObject).ToList()。一切都像魅力一样。

这是简化的类结构:

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

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

但是,在一个用例中,我需要检索所有引用任何“汽车”的“评论”实例。换句话说,我正在尝试实现以下目标:

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() 未实现异常),但无论如何有可能解决这个问题吗?很可能我可以通过创建两个单独的表来轻松解决我的问题:一个用于所有“汽车”cmets,一个用于所有“房屋”cmets,但我现在不想更改数据库结构或模型。

非常感谢您的反馈。

【问题讨论】:

  • 通过使用 QueryOver() 而不是 Query() 解决了该问题。这允许类似 Session.QueryOver().Where(m => m.Entity is Car);没有任何运行时异常。

标签: c# nhibernate subclass fluent


【解决方案1】:

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

【讨论】:

  • 你能发布解决方案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2010-10-12
  • 1970-01-01
相关资源
最近更新 更多