流畅的NHibernate继承问题

时间:2010-08-12 13:29:26

标签: fluent-nhibernate

我正在使用Nhibernate和Fluent,我遇到了继承问题。

这是我的数据库架构

TABLE Base

  • IDBASE(PK)
  • 字段1
  • TYPE

表T1

  • IDBASE(PK和FK)
  • 字段2
  • Field3 ......

我的映射文件是:

public class BaseMap: ClassMap<BASE>
{
    public BaseMap()
    {
        Id(x => x.Id, "IDBASE").GeneratedBy.Identity();

        Map(x => x.Field1);
        DiscriminateSubClassesOnColumn("TYPE");
    }
 }

    public class T1Map: SubclassMap<T1>
    {

        public T1Map()
        {
            Table("T1");
            KeyColumn("IDBASE");
            DiscriminatorValue("T1");

            Map(x => x.Field2).Not.Nullable();
            Map(x => x.Field3).Not.Nullable();
        }
    }

我使用FluentMappings而不是AutoMapping。

这是我的实体:

public abstract class BASE
{
   public virtual long IdBase{ get; set; }
   public virtual string Field1 { get; set; }
}

public class T1: BASE
{
    public virtual string Field2 { get; set; }
    public virtual string Field3 { get; set; }
}

T1实体继承自BASE实体,问题是当我尝试获取一行时NHibernate尝试在基表上选择Field2和Field3,而应该在T1表上选择它们。

我已经尝试过几十种黑客但它仍然不起作用,如果有人认为它会非常有帮助。

非常感谢。

2 个答案:

答案 0 :(得分:2)

您正在指定一个鉴别器,这意味着继承结构应该是每个类的表层次结构;你没有这个设置的两个表,你将拥有一个包含所有内容的表(因此select为所有列命中相同的表)。

如果您删除DiscriminateSubclassesOnColumn来电,那么您的映射会按照每个类的表格进行,这样您就可以获得所需的结构。

答案 1 :(得分:0)

实际上我真的需要DiscriminateSubclassesOnColumn所以我找到了另一个解决方案,在我继承的实体中,我使用这样的连接进行映射:

public class T1Map: SubclassMap<T1>
{

    public T1Map()
    {
        Join("T1", y =>
        {
            y.KeyColumn("IDBASE");
            y.Map(x => x.Field2).Not.Nullable();
            y.Map(x => x.Field3).Not.Nullable();
        }); 
    }
}

它工作正常,我可以在我的基类上保留Discriminator列。

由于