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