Fluent Nhibernate如何在SubclassMap中指定Id()

时间:2010-01-14 05:04:41

标签: nhibernate orm fluent-nhibernate

我正在调整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 个答案:

答案 0 :(得分: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);
  }
}