Fluent NHibernate如何在SubclassMap中指定Id()?

3

我正在将Fluent NHibernate适配到我们现有的遗留应用程序中,并试图确定如何使用ClassMap和SubclassMap来处理所示的实体层次结构。

// BaseObject contains database columns common to every table
public class BaseObject
{
    // does NOT contain database id column
    public string CommonDbCol1 { get; set; }
    public string CommonDbCol2 { get; set; }
    // ...
}

public class Entity1 : BaseObject
{
    public int Entity1Id { get; set; }
    // other Entity1 properties
}

public class Entity2 : BaseObject
{
    public int Entity2Id { get; set; }
    // other Entity2 properties
}

Entity1和Entity2的身份列在每个表中都有唯一的名称。BaseObject包含所有实体共有的列。我没有使用AutoMapping,认为可以在BaseObject上使用ClassMap,然后在每个实体上使用SubclassMap,就像这样:

public class Entity1Map : SubclassMap<Entity1>
{
    public Entity1Map()
    {
        Id(x => x.Entity1Id);
        // ...
    }
}

问题是,SubclassMap没有定义Id()方法。那么,在每个Entity1Map、Entity2Map等中(我们有100多个实体类都继承自BaseObject),我如何指定特定实体的Id?谢谢提前提供任何见解!
1个回答

8
在Fluent NHibernate或NHibernate中都无法实现这一点。您是想将您的类映射为子类,还是只想共享常用的映射?如果您真的想要子类,则需要让它们共享标识列,没有其他方法;如果您不想要实际的子类,请创建一个抽象的ClassMap<T> where T : BaseObject,并在其中映射共同属性。
例如:
public abstract class BaseObjectMap<T> : ClassMap<T> where T : BaseObject
{
  public BaseObjectMap()
  {
    Map(x => x.CommonProperty1);
  }
}

我现在明白了区别,抽象类BaseObjectMap正是我需要的。太棒了。非常感谢! - kenswdev
很好的回答。这就是我第一次期望使用子类工作的方式。感谢您周到的解决方案。 - Don Fitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接