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

FluentNHibernateпозволяет задавать связи один к одному, один ко многим и многие ко многим посредством специальных конструкций:HasOne,HasMany,HasManyToMany.

Рассмотрим примеры создания этих трех типов связей на примерах.

        1. Связь один к одному

Для связи один к одному возьмем объекты «Студент» и «Зачетная книжка» - один студент может иметь только одну зачетную книжку. Для начала создадим классы студента и зачетной книжки:

namespace Fluent.Domain

{

//Домен студента

public class Student

{

public virtual long Id { get; set; }

public virtual string FirstName { get; set; }

public virtual string LastName { get; set; }

public virtual char Sex { get; set; }

public virtual int Year { get; set; }

//Ссылка на зачетную книжку

public virtual RecordBook RecordBook { get; set; }

}

}

namespace Fluent.Domain

{

//Домен зачетной книжки

public class RecordBook

{

public virtual long Id { get; set; }

public virtual string Number { get; set; }

//Ссылка на студента

public virtual Student Student { get; set; }

}

}

Теперь необходимо создать классы отображения (map-классы):

namespace Fluent.Mappings

{

//Класс отображения зачетной книжки

public class RecordBookMap : ClassMap<RecordBook>

{

public RecordBookMap()

{

//Указание имени таблицы для зачетной книжки

Table("RecordBooks");

//Отображение идентификатора на колонку таблицы

Id(x => x.Id).GeneratedBy.Native();

//Отображение обычного поля на колонку таблицы

Map(x => x.Number);

//Ссылка на студента

References(x => x.Student).Column("StudentId").Cascade.All();

}

}

}

namespace Fluent.Mappings

{

//Класс отображения студента

public class StudentMap : ClassMap<Student>

{

public StudentMap()

{

//Указание имени таблицы для студента

Table("Students");

Id(x => x.Id).GeneratedBy.Native();

Map(x => x.FirstName);

Map(x => x.LastName);

Map(x => x.Sex);

Map(x => x.Year);

//Связь один к одному

HasOne(x => x.RecordBook).ForeignKey("StudentId").Cascade.All();

}

}

}

Как видно из примера, каждый класс отображения содержит конструкцию для указания имени таблицы в базе данных (Table), конструкцию для отображения ключевого поля на таблицу базы данных (Id), конструкции для отображения информационных полей на таблицу базы данных (Map), конструкции для связывания объектов. В данном примере, для того чтобы связать объекты «Студент» и «Зачетная книжка» связью один к одному в классе студента необходима ссылка на объект «Зачетная книжка»:

public virtual RecordBook RecordBook { get; set; }

В классе зачетной книжки для того, чтобы с объекта зачетной книжки можно было получить доступ к студенту, в классе зачетной книжки необходима ссылка на объект «Студент»:

public virtual Student Student { get; set; }

В классах отображения тоже должны быть соответствующие поля. Со стороны студента:

HasOne(x => x.RecordBook).ForeignKey("StudentId").Cascade.All();

Со стороны зачетной книжки должно быть поле:

References(x => x.Student).Column("StudentId").Cascade.All();

В соответствии с классами отображения в базе данных автоматически создаются таблицы, изображенные на рисунке 4.1 и 4.2.

Рисунок 4.1 – Таблица зачетной книжки

Рисунок 4.2 – Таблица студента

Рассмотрим теперь связь один ко многим.