可选的SubclassMap(左连接)与NHibernate 3.0 GA& FNH

时间:2010-12-10 20:30:30

标签: nhibernate fluent-nhibernate nhibernate-mapping

免责声明:我对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版本之间发生重大变化。但是,如前所述,我是一名新秀,很可能会做一些愚蠢的事情。如果是这样的话,我非常感谢有人用可能显而易见的东西打我的头。

提前致谢。

1 个答案:

答案 0 :(得分:2)

实体有一种类型,不会改变。如果您的BaseClass表中只有一条记录,那么该实体将永远是MyBaseClass。

如果实体可以更改其“类型”,则不应使用继承,而应使用合成。