- •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
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Контрольные вопросы
- •Рекомендованная литература
Связи между объектами в FluentNHibernate
FluentNHibernateпозволяет задавать связи один к одному, один ко многим и многие ко многим посредством специальных конструкций: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 – Таблица студента
Рассмотрим теперь связь один ко многим.