流畅的Nhibernate Aggregate对象映射

时间:2011-08-14 03:35:06

标签: c# nhibernate orm fluent-nhibernate

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

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创建一个map类,因为这不会将成员定义为虚拟。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

像往常一样映射您的班级MyMovie,并使用MovieDirector的禁用延迟加载。 Aftter对于多对多部分的所有延迟加载都应该起作用,因为不需要收集懒惰代理。

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();
    }
}