从多个到多个流利的nhibernate获取记录?

时间:2011-01-31 19:30:22

标签: nhibernate fluent-nhibernate join

我遵循流利的nhibernate Getting started tutorial 建立了多对多的关系。

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

现在我不确定如何检索数据。例如,如果我想获得商店所有产品,会发生什么。

所以我需要在products表上使用storeId。但是product表中没有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;

我在查看b时得到的错误。

  

无法初始化集合:   [Student.Courses#757f27a2-e997-44f8-b2c2-6c0fd6ee2c2f] [SQL:   SELECT courses0_.Student_id as   Student3_1_,courses0_.Course_id as   Course1_1_,course1_.CourseId as   CourseId2_0_,course1_.Prefix as   Prefix2_0_,course1_.BackgroundColor   as Backgrou3_2_0_ FROM PermissionLevel   courses0_左外连接课程   course1_ on   courses0_.Course_id = course1_.CourseId   WHERE courses0_.Student_id =?]“

2 个答案:

答案 0 :(得分:1)

不,你没有。 StoreProduct是一个特殊的表,它包含Store和Products之间的多对多关系。 NHibernate能够自动使用此表填充Store的产品集合。它应该在映射中描述。您应该像这样查询:

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

这是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")他们告诉NHibernate使用表 StoreProduct 作为集合中多对多关系存储对象的来源产品

答案 1 :(得分:0)

您的学生映射错误:

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

应该遵循:

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

你的学生课不完整。