我正在使用Nhibernate和Fluent,我遇到了继承问题。
这是我的数据库架构
TABLE Base
表T1
我的映射文件是:
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表上选择它们。
我已经尝试过几十种黑客但它仍然不起作用,如果有人认为它会非常有帮助。
非常感谢。
答案 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列。
由于