FluentNHibernate - 引用子类的HasMany引用问题,其中引用位于父类中

时间:2014-07-28 16:58:52

标签: c# inheritance nhibernate fluent-nhibernate mapping

我想引用父类及其子类,但我对下面的结构有疑问。 NHibernate在父表和子表中生成引用列。

public class Container{
    public virtual IEnumerable<SomeClass> SomeClasses {get;set;}
    public virtual IEnumerable<SomeSubClass> SomeSubClasses {get;set;}
}

public class SomeClass{
    public virtual Container Container {get;set;}
    ...
}

public class SomeSubClass: SomeClass{
    ...
}

public class ContainerMap: ClassMap<Container>{
    public ContainerMap(){
        Table("Container");
        ...
        HasMany(x => x.SomeClasses)
                .KeyColumn("ContainerID")
                .Cascade.AllDeleteOrphan()
                .LazyLoad()
                .Inverse()
                .AsBag();

            HasMany(x => x.SomeSubClasses)
                .KeyColumn("ContainerID")
                .Cascade.AllDeleteOrphan()
                .LazyLoad()
                .Inverse()
                .AsBag();
        ...
    }
}

public class SomeClassMap: ClassMap<SomeClass>{
    public SomeClassMap(){
        Table("Parent");
        ...
        References(x => x.Container, "ContainerID").Cascade.SaveUpdate();
        ...
    }
}
public class SomeSubClassMap: SubclassMap<SomeClass>{
    public SomeSubClassMap(){
        Table("Child");
        ...
    }
}

我找到解决方法的唯一方法是指定映射,如下所示:

HasMany<SomeClass>(x => x.SomeSubClasses)
                .KeyColumn("ContainerID")
                .Cascade.AllDeleteOrphan()
                .LazyLoad()
                .Inverse()
                .AsBag();

有了这个,NHibernate不会在子表中生成ContainerID列,但是在加载填充了IEnumerable的容器时我得到一个异常。例外:

System.ArgumentException:值&#34; Models.SomeClass&#34;不属于&#34; Models.SomeSubClass&#34;并且不能在此通用集合中使用。 参数名称:值

如何正确映射此结构?

0 个答案:

没有答案