2011-01-31 11 views
0

私は流暢なnhibernate Getting started tutorialに従うことによって、多対多の関係を作りました。多くの人から多くの人が流暢なnhibernateにレコードを取得していますか?

http://wiki.fluentnhibernate.org/images/2/24/FirstProjectSchema.png

今、私は、データを取得する方法がわからないです。たとえば、店が運ぶすべての商品を手に入れたいとしたらどうなりますか?

したがって、商品表でstoreIdを使用する必要があります。しかし、商品テーブルにはstoreIdがありません。StoreProductのマッピングやプロパティを実際に含むクラスはありません。

だから私は、だから私は、ストアおよび製品に参加し、それらにクエリを実行する何をする必要があります

session.Query<StoreProduct>().Where(x => x.StoreId == "1").toList(); 

を行くことができませんか?ここで

編集

は、私が持っているものの骨抜きバージョンです。

 public class Student 
     { 
      public virtual Guid StudentId { get; private set; } 
      public virtual IList<Course> Courses { get; set; } 
      public virtual IList<Permission> Permissions{get; set;} 


      public Student() 
      { 
       Courses = new List<Course>(); 
       Permissions = new List<Permission>(); 
      } 

    public class StudentMap : ClassMap<Student> 
     { 
      public StudentMap() 
      { 
       Table("Students"); 
       Id(x => x.StudentId).Column("StudentId"); 
       HasManyToMany(x => x.Permissions).Table("PermissionLevel"); 
       HasManyToMany(x => x.Courses).Table("PermissionLevel"); 
      } 
     } 

    public class CourseMap : ClassMap<Course> 
    { 
     public CourseMap() 
     { 
      Table("Courses"); 
      Id(x => x.CourseId).Column("CourseId"); 
      HasManyToMany(x => x.Permissions).Table("PermissionLevel"); 
      HasManyToMany(x => x.Students).Table("PermissionLevel"); 
     } 
    } 

    public class Course 
    { 
     public virtual int CourseId { get; private set; } 
     public virtual IList<Permission> Permissions { get; set; } 
     public virtual IList<Student> Students { get; set; } 


     public Course() 
     { 
      Permissions = new List<Permission>(); 
      Students = new List<Student>(); 
     } 
    } 

    public class PermissionMap : ClassMap<Permission> 
    { 
     public PermissionMap() 
     { 
      Table("Permissions"); 
      Id(x => x.PermissionId).Column("PermissionId"); 
      HasManyToMany(x => x.Students).Table("PermissionLevel"); 
     } 
    } 

public class Permission 
    { 
     public virtual int PermissionId { get; private set; } 
     public virtual IList<Student> Students {get; set;} 

     public Permission() 
     { 
      Students = new List<Student>(); 
     } 
    } 


var a = session.Query<Student>().Where(x => x.Email == email).FirstOrDefault(); 
      var b = session.Get<Student>(a.StudentId).Courses; 

エラーが発生したときにエラーが発生します。 Course1_1_、course1_.CourseIdとして Student3_1_、courses0_.Course_idとして SELECT courses0_.Student_id: [Student.Courses#757f27a2-e997-44f8-b2c2-6c0fd6ee2c2f] [SQL:

は、コレクションを初期化できませんでした ようCourseId2_0_、course1_.Prefixは としてPrefix2_0_、course1_.BackgroundColor はBackgrou3_2_0_はPermissionLevel FROM courses0_は courses0_.Course_id = course1_.CourseId WHERE courses0_.Student_id =?]」

にコース course1_を外部結合を残したとして、

答えて

0

あなたは学生のための間違ったマッピングを持っている:

HasManyToMany(x => x.Permissions).Table("PermissionLevel"); 
HasManyToMany(x => x.Courses).Table("PermissionLevel"); 

それは次のようする必要があります。

HasManyToMany(x => x.Courses).Table("StudentCourses"); 

そして、あなたStudentクラスは不完全です。

+0

はどのように不完全ですか。私は両方のPermissionLevelテーブルを使用することはできません? – chobo2

+0

@ chobo2マッピングに存在するコレクション権限がありません。このコードによれば、行HasManyToMany(x => x.Permissions).Table( "PermissionLevel"); 'はコンパイルしないでください – gor

+0

ああ例をコピーするときに間違って削除しました。 – chobo2

1

いいえ、ありません。 StoreProductは、ストアと商品間の多対多関係を保持する特別なテーブルです。 NHibernateは自動的にこのテーブルを使用してStoreのコレクションを取り込むことができます。マッピングで説明する必要があります。

public class StoreMap : ClassMap<Store> 
{ 
    public StoreMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.Name); 
    HasMany(x => x.Staff) 
     .Inverse() 
     .Cascade.All(); 
    HasManyToMany(x => x.Products) 
    .Cascade.All() 
    .Table("StoreProduct"); 
    } 
} 

お知らせラインHasManyToMany(x => x.Products).Table("StoreProduct")彼らは、多対多の関係ストアのソースとして、テーブルStoreProductを使用するようにNHibernateのを教えて:

var storeProducts = session.Get<Store>(1).Products; 

ここストアのマッピングがあります:あなたはこのように問い合わせをしますコレクションのオブジェクト製品

+0

@gor - だから私はそれについて私のファイルにマッピングする必要があります。多分私はそれを逃した。また、行はコンパイルされません。()はオブジェクトIDが必要なようです。 – chobo2

+0

はい、私はIDを忘れました – gor

+0

@gor - "コレクションを初期化できませんでした:" – chobo2

関連する問題