2011-08-14 10 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;} 
} 

このためDBスキーマは、3つの表のようになります。

ムービー(M_ID、タイトル)

ディレクター(D_ID、名)

が指示(M_ID、D_ID)

これを流暢なnhibernateでマップすることは可能ですか?私はこれが、メンバーを仮想として定義していないので、私がDirectorのマップクラスを作成することができない外部クラスに、多対多の関係がどのように行われるのか分かりません。

答えて

0

クラスをマップするMyMovie通常通り、無効なlazyloadingを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(); 
    } 
} 
0

基本的には、nhibernateにオブジェクトのロードを指示しようとしていますが、オブジェクトについては何も知らないという問題があります。たとえば、MyMovieにムービーが含まれていると言っているにもかかわらず、Movie.titleがどのフィールドに属しているのかわからず、マップされていないためDirectorとムービーを結合する方法がわかりません。基本的にSQLクエリを発行し、結果をオンザフライマッピングでオブジェクトに変換するには、Criteriaと結果のトランスフォーマを使用する必要があります。このロジックをそれはあまりにも厄介ではなく、あなたのコードで呼び出すことができる関数ですが、それ以外は私はそれの周りに他の方法を見ることはできません。この記事をチェックすると、あなたがしなければならないのは、(あなたがディレクターに参加しなければならないので)コードが正確には何をしようとしているのかというだけではなく、同じツールを使用している... http://ayende.com/blog/2741/partial-object-queries-with-nhibernate

+0

これは基本的にこれはできないと言っていますか?これを行う最も直接的な方法は、すべての外部クラスに対してラッパークラスまたは何かを作成することですか?私は変圧器などであらゆる種類の狂ったものをやっているという考えが好きではありません。私はちょうど標準のNHメソッドを使用してマップしたいです。 – user623879

関連する問題