流畅的Nhibernate聚合对象映射

本文关键字:对象 映射 Nhibernate | 更新日期: 2023-09-27 18:05:25

假设我有以下类,其中包含一个外部类的聚合:

public class MyMovie
{
    public virtual string id{get;set;}
    public virtual Movie movie{get;set;}
}
//These classes are externally defined and cannot be changed.
public class Movie
{
    public string title{get;set;}
    public IList<Director> Directors{get;set;}
}
public class Director
{
    public string name{get;set;}
    public IList<Movie> DirectedMovies{get;set;}
}

这个数据库模式应该是三个表:

电影(m_id、标题)

导演(d_id名称)

指导(m_id d_id)

是否有可能映射这与流利的nhibernate?我只是不明白这将如何与外部类中的多对多关系一起完成,我不能为Director映射创建映射类,因为这没有将成员定义为virtual。

流畅的Nhibernate聚合对象映射

像往常一样映射你的类MyMovie,并禁用MovieDirector的惰性加载。毕竟,多对多部分的惰性加载应该像往常一样工作,因为不需要集合惰性代理。

public class MyMovieMap : ClassMap<MyMovie>
{
    public MyMovieMap()
    {
        Id(x => x.id);
        References(x => x.movie);
    }
}
public class MovieMap : ClassMap<Movie>
{
    public MovieMap()
    {
        Not.LazyLoad();
        Id<int>("m_id");
        Map(x => x.title);
        HasManyToMany(x => x.Directors)
            .Table("Directs")
            .LazyLoad();
    }
}
public class DirectorMap : ClassMap<Director>
{
    public DirectorMap()
    {
        Not.LazyLoad();
        Id<int>("d_id");
        Map(x => x.name);
        HasManyToMany(x => x.DirectedMovies)
            .Table("Directs")
            .LazyLoad();
    }
}

基本上,这里的问题是您试图告诉nhibernate加载对象,但它对对象一无所知。例如,你告诉它MyMovie包含一个Movie,但它不知道Movie是什么字段。标题属于,它不知道如何加入Director's与电影,因为它是未映射的。所以基本上,为了在没有映射文件的情况下完成这一点,您需要使用Criteria和结果转换器来完成这一点(基本上是发出sql查询并通过动态映射将结果转换为对象),您可以将此逻辑封装在函数中,以便在代码中调用它而不会太混乱,但除此之外,我看不到任何其他方法。看看这篇文章,代码并不是你想要做的(因为你必须加入董事),但它使用的是你必须使用的相同工具…http://ayende.com/blog/2741/partial-object-queries-with-nhibernate