Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Связь многие ко многим
Для связи многие ко многим выберем объекты «Преподаватель» и «Предмет». Один преподаватель может вести много предметов и один предмет может вести несколько преподавателей. Создадим классы домены для преподавателя и для предмета:
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.
|