我有下面描述的继承:
public abstract class BaseEntity<TId> {....}
public abstract class ModelEntity : BaseEntity<Int32>{....}
public abstract class AuditableEntity : ModelEntity,IAuditable{....}
public class ApplicationUser : AuditableEntity{....}
public class SuperUser : ApplicationUser
我正在使用NHibernate 3.3,我想创建该继承的映射
public abstract class ModelEntityMap<TEntity> : ClassMapping<TEntity>
where TEntity : ModelEntity
{...}
public class AuditableEntityMap<TEntity> : ModelEntityMap<TEntity> where TEntity : AuditableEntity
{ ...}
public class ApplicationUserMap : AuditableEntityMap<ApplicationUser>
{...}
public class SuperUserMap : JoinedSubclassMapping<SuperUser>{...}
当应用程序启动并尝试设置数据库时,会引发以下异常: SuperUser的模糊映射找到了多个根实体BaseEntity / ApplicationUser
可能的解决方案 -Merge根实体的映射表示层次结构中的真实根 - 使用逻辑注入IModelInspector以发现真正的根实体。
我使用Fluent nhibernate具有相同的继承,并且使用定义为的SuperUserMap工作得很好 公共类SuperUserMap:SubClassMap {...}
我是代码的Nhibernate映射新手,非常困惑!!!
答案 0 :(得分:0)
我相信有两种方法可以解决这个问题: a)使用鉴别器的概念来识别存储的类的类型,从而从数据库中检索正确的对象,在这种情况下,您的类被映射到具有所有列和鉴别器列的表。不确定这是如何使用多级继承,但这是你可以谷歌。
b)看看这篇关于他如何处理继承的帖子:http://fabiomaulo.blogspot.co.nz/2011/04/nhibernate-32-mapping-by-code_13.html你可能会想到解决你的问题。
答案 1 :(得分:0)
您可以通过覆盖用于创建映射的模型映射器的IsRootEntity逻辑来影响实体是否为根实体的决策。
这是一个定义默认NHibernate逐个代码行为的示例:
03 03 03
您必须调整此决策逻辑,以将BaseEntity类排除为可能的根实体。
答案 2 :(得分:0)
我在NHibernate 4。1。1(2017年5月)中遇到此错误,所以我正在回答我是如何解决它以供将来参考的
就我而言,我复制了一个继承类的现有映射,忘了将父映射类更改为ClassMapping
并遇到同样的错误
换句话说,在您的映射类中,检查父类,确保它是ClassMapping
或JoinedSubclassMapping
,如果它是子类