- •Java и c# технологии прикладного програмирования
- •Java и c# технологии прикладного програмирования
- •Содержание
- •Введение
- •Лабораторная работа № 1 Коллекции c#
- •Цель работы
- •Теоретические сведения
- •Общие сведения о платформе .Net
- •Общие сведения о коллекциях c#
- •Обобщенные коллекции с#
- •Порядок выполнения лабораторной работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Получение информации о типе
- •Экземпляр типа Type
- •Получение экземпляра типа Type
- •Динамическая загрузка сборок
- •Динамическая загрузка типов
- •Исследование типа
- •Характеристики типа как целого
- •Члены класса
- •Динамическое создание объекта и вызов методов
- •Создание объекта по его типу
- •Динамический вызов методов
- •Использование интерфейсов
- •Позднее связывание
- •Динамическое приведение типов
- •Новые механизмы абстракции
- •Динамическое создание типов
- •Динамическое создание программного кода
- •Динамическое создание класса
- •Динамическое создание перечислений
- •Динамический "Hello World!"
- •Динамическое разворачивание циклов
- •Атрибуты
- •Атрибут это класс
- •Декларативное программирование
- •Код, выполняемый во время разработки
- •Использование атрибутов
- •Использование встроенных атрибутов
- •Определение и использование пользовательских атрибутов
- •Пример декларативного программирования
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Связный уровень взаимодействия ado.Net
- •Несвязный уровень взаимодействия ado.Net
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Связи между объектами в FluentNHibernate
- •Связь один к одному
- •Связь один ко многим
- •Связь многие ко многим
- •Способы выборки объектов в FluentNHibernate
- •Запросы NativeSql
- •Запросы по критерию
- •Запросы по образцу
- •Запросы hql
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Компиляция страниц по требованию
- •Страница asp.Net 2.0
- •Директива @Page
- •Жизненный цикл страницы
- •Новые свойства и методы объекта Page
- •Управление страницей
- •Установка выделения на элемент управления
- •Обновление данных без перезагрузки страницы
- •Отправка данных формы другой странице asp.Net
- •Шаблоны дизайна страниц
- •Создание шаблона дизайна
- •Создание страницы
- •Обработка шаблонов средой asp.Net
- •Использование разных шаблонов для разных браузеров
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Библиотеки модульного тестирования в .Net
- •Unit Testing Framework от Microsoft
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Контрольные вопросы
- •Рекомендованная литература
Связь многие ко многим
Для связи многие ко многим выберем объекты «Преподаватель» и «Предмет». Один преподаватель может вести много предметов и один предмет может вести несколько преподавателей.
Создадим классы домены для преподавателя и для предмета:
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.