Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


—в€зи между объектами в Fluent NHibernate




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

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

—в€зь один к одному

ƒл€ св€зи один к одному возьмем объекты Ђ—тудентї и Ђ«ачетна€ книжкаї - один студент может иметь только одну зачетную книжку. ƒл€ начала создадим классы студента и зачетной книжки:

 

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 Ц “аблица студента

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

—в€зь один ко многим

ƒл€ св€зи один ко многим возьмем объекты Ђ√руппаї и Ђ—тудентї. ¬ одной группе может быть много студентов. ќдин студент может состо€ть только в одной группе.

—оздадим классы домены дл€ группы и студента:

 

namespace Fluent.Domain

{

//ƒомен группы

public class Group

{

private IList<Student> studentList = new List<Student>();

 

public virtual long Id { get; set; }

 

public virtual string GroupName { get; set; }

 

public virtual string CuratorName { get; set; }

 

public virtual string HeadmanName { get; set; }

 

public virtual IList<Student> StudentList

{

get { return studentList; }

set { studentList = value; }

}

 

}

}

 

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 Group Group { get; set; }

 

}

}

ќбратите внимание, что со стороны группы содержитс€ список дл€ хранени€ студентов.

—оздадим классы отображени€ дл€ группы и студента:

 

using System;

using System.Collections.Generic;

using FluentNHibernate.Mapping;

using Fluent.Domain;

 

namespace Fluent.Mappings

{

// ласс отображени€ группы

public class GroupMap:ClassMap<Group>

{

public GroupMap()

{

Table("Groups");

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

Map(x => x.GroupName);

Map(x => x.CuratorName);

Map(x => x.HeadmanName);

//—в€зь один ко многим

HasMany(x => x.StudentList)

.KeyColumns.Add("GroupId")

Inverse()

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);

//—сылка на руппу

References(x => x.Group).Column("GroupId").Cascade.All();

}

}

}

 

¬ отличие от св€зи один к одному, со стороны один в классе отображени€ находитс€ конструкци€:

 

HasMany(x => x.StudentList)

.KeyColumns.Add("GroupId")

Inverse()

Cascade.All();

ј со стор многие, как и в св€зи один к одному находитс€ конструкци€:

References(x => x.Group).Column("GroupId").Cascade.All();

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

–исунок 4.3 Ц “аблица группы

–исунок 4.4 Ц “аблица студента

–ассмотрим теперь св€зь многие ко многим

—в€зь многие ко многим

ƒл€ св€зи многие ко многим выберем объекты Ђѕреподавательї и Ђѕредметї. ќдин преподаватель может вести много предметов и один предмет может вести несколько преподавателей.

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

 

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.





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2016-11-24; ћы поможем в написании ваших работ!; просмотров: 811 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

80% успеха - это по€витьс€ в нужном месте в нужное врем€. © ¬уди јллен
==> читать все изречени€...

1271 - | 1156 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.055 с.