2011-08-14 135 views
1

说我有下面的类与外部类的集合:流利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创建地图类,因为这不会将成员定义为虚拟。

回答

0

Map your class 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(); 
    } 
} 
0

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

+0

所以你基本上说这不能按原样做?最简单的方法是做包装类还是所有外部类的东西?我不喜欢用变形金刚等做各种疯狂的东西的想法,我都不愿意看到这些。我只想使用标准的NH方法进行映射。 – user623879