免责声明:我对NH& ORM一般。
免责声明:我正在使用来自here的FNH版本,以便与NH3.0GA一起使用。
简而言之,问题是我想使用FNH的SubclassMap
作为将LEFT JOIN,每子类表场景映射到我的对象层次结构的方法,该层次结构定义为:
public class MyBaseClass {
public virtual int Id { get; set; }
}
public class MySubClass : MyBaseClass {
public virtual string SubClassVal { get; set; }
}
这通过FNH映射为:
public class MyBaseClassMap : ClassMap<MyBaseClass> {
public MyBaseClassMap() {
Table("BaseClass");
Id(x => x.Id, "Id").GeneratedBy.Assigned();
}
}
public class MySubClassMap : SubclassMap<MySubClass> {
public MySubClassMap() {
Table("SubClass");
KeyColumn("Id");
Map(x => x.SubClassVal);
}
}
我通过以下方式检索:
public class Repository {
ISession session; //assume properly initialized ISession
public IList<T> GetAll<T>() where T: class {
return session.CreateCriteria<T>().List<T>();
}
}
在我的数据库中,我的BaseClass
表中有1条记录,SubClass
中有0条记录。
现在,我想做的是通过执行以下操作将实体拉出MySubClass
实例:
var rep = new Repository();
var subclasses = rep.GetAll<MySubClass>();
当然,返回的集合中没有实例,因为这可能是在它下面执行INNER JOIN。这就是我被困住的地方。我已经设法发现指定一个'可选'连接是我应该做的事情。我试图将MySubClassMap
修改为:
public class MySubClassMap : SubclassMap<MySubClass> {
public MySubClassMap() {
Join("SubClass", j => {
j.KeyColumn("Id");
j.Optional();
j.Map(x => x.SubClassVal); // note that I've tried the map outside the Join() below, to no avail
});
//Map(x => x.SubClassVal);
}
}
编译/运行这会给我带来以下(最里面的)异常:
命名空间'urn:nhibernate-mapping-2.2'中的元素'joined-subclass'在命名空间'urn:nhibernate-mapping-2.2'中具有无效的子元素'join'。预期可能元素的列表:'属性,多对一,一对一,组件,动态组件,属性,任何,映射,集合,列表,包,idbag,数组,原始数组,连接子类,loader,sql-insert,sql-update,sql-delete,resultset,query,sql-query'innamespace'瓮:nhibernate-mapping-2.2'。
我将保存发布堆栈跟踪,但它的主旨是:
MyApp -->
FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() -->
NHibernate.Cfg.FluentConfiguration.BuildConfiguration()
我认为这是所有相关信息。我怀疑我可能会在这个新版本的NH和FNH版本之间发生重大变化。但是,如前所述,我是一名新秀,很可能会做一些愚蠢的事情。如果是这样的话,我非常感谢有人用可能显而易见的东西打我的头。
提前致谢。
答案 0 :(得分:2)
实体有一种类型,不会改变。如果您的BaseClass表中只有一条记录,那么该实体将永远是MyBaseClass。
如果实体可以更改其“类型”,则不应使用继承,而应使用合成。