2011-08-14 134 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