Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы Java и C# технологии.doc
Скачиваний:
171
Добавлен:
01.03.2016
Размер:
3.04 Mб
Скачать
        1. Связь многие ко многим

Для связи многие ко многим выберем объекты «Преподаватель» и «Предмет». Один преподаватель может вести много предметов и один предмет может вести несколько преподавателей.

Создадим классы домены для преподавателя и для предмета:

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 – Промежуточная таблица преподавателя и предмета

Более детально со связями между объектами, а также с параметрами связей можно ознакомиться в книгах NHibernateinActionиNHibernateCookbook.