Для связи многие ко многим выберем объекты «Преподаватель» и «Предмет». Один преподаватель может вести много предметов и один предмет может вести несколько преподавателей.
Создадим классы домены для преподавателя и для предмета:
namespace Fluent.Domain
{
//Класс домена предмета
public class Subject
{
private IList<Teacher> teacherList = new List<Teacher>();
public virtual long Id { get; set; }
public virtual string SubjectName { get; set; }
public virtual int HoursNumber { get; set; }
public virtual IList<Teacher> TeacherList
{
get { return teacherList; }
set { teacherList = value; }
}
}
}
namespace Fluent.Domain
{
//Класс домена преподавателя
public class Teacher
{
private IList<Subject> subjectList = new List<Subject>();
public virtual long Id { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual IList<Subject> SubjectList
{
get { return subjectList; }
set { subjectList = value; }
}
}
}
Обратите внимание, что класс предмета содержит коллекцию для хранения преподавателей, а класс преподавателей содержит коллекцию для хранения предметов.
Создадим классы отображения для предмета и преподавателя:
namespace Fluent.Mappings
{
//Класс отображения предмета
public class SubjectMap:ClassMap<Subject>
{
public SubjectMap()
{
Table("Subjects");
Id(x => x.Id).GeneratedBy.Native();
Map(x => x.SubjectName);
Map(x => x.HoursNumber);
//Связь многие ко многим
HasManyToMany(x => x.TeacherList)
.Table("TeacherSubject")
.ParentKeyColumn("SubjectId")
.ChildKeyColumn("TeacherId");
}
}
}
namespace Fluent.Mappings
{
//Класс отображения преподавателя
public class TeacherMap:ClassMap<Teacher>
{
public TeacherMap()
{
Table("Teachers");
Id(x => x.Id).GeneratedBy.Native();
Map(x => x.FirstName);
Map(x => x.LastName);
//Связь многие ко многим
HasManyToMany(x => x.SubjectList)
.Table("TeacherSubject")
.ParentKeyColumn("TeacherId")
.ChildKeyColumn("SubjectId");
}
}
}
Обратите внимание, что в классах отображениях с обеих сторон указывается конструкция HasManyToMany
Поскольку связь многие ко многим в реляционных базах данных осуществляется через отдельную таблицу, то в базе данных будет автоматически создано три таблицы, которые представлены на рисунках 4.5, 4.6 и 4.7.
Рисунок 4.5 – Таблица предмета
Рисунок 4.6 – Таблица преподавателя
Рисунок 4.7 – Промежуточная таблица преподавателя и предмета
Более детально со связями между объектами, а также с параметрами связей можно ознакомиться в книгах NHibernate in Action и NHibernate Cookbook.