我遵循流利的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 =?]“
答案 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");
你的学生课不完整。