Уроки з FluentNHibernate c ASP.NET MVC і SQL Server. Частина 1

Що буде? Уроки з FluentNHibernate на прикладі книжкового сайту, де будемо можливість переглядати інформацію про книгу, виводити список книг, фільтрувати його за жанрами, здійснювати пошук за назвою, а також додавати, редагувати, видаляти книги. Будуть розглянуті всі види зв'язків таблиць (один-до-одного, один-до-багатьох, багато-до-багатьох), створення, редагування, вилучення записів, фільтрація, пошук, відображення посторінково. Програми, що використовуються на уроках: Visual studio 2013, SQL Server 2008 Studio Manager.

Для швидкого ознайомлення з простою операцією CRUD з NHibernate і MVC рекомендую прочитати наступну статтю англійською: www.dotnetjalps.com/2014/07/fluent-nhibernate-asp-net-mvc-crud.html.

Також корисні статті можна знайти тут: github.com/jagregory/fluent-nhibernate/wiki/Getting-started (англ.); і його переклад: habrahabr.ru/post/125135.

Ще посилання російською мовою: slynetblog.blogspot.com/2009/10/nhibernate-1.html

1. ЗАПУСК ПЕРШОГО ДОДАТКА
1.1 Установка Fluent NHibernate
Відкриваємо Visual Studio, відкриваємо меню File, переходимо на підменю New Project. У вікні вибираємо ASP.NET MVC 4 (Якщо вибрано .Net Framework 4 Версії). Вводимо назву «BibliotecaTutor» та вибираємо тип «Basic». (Далі я буду писати скороченоFile->New->Project RClick — права кнопка)



Далі запускаємо Nuget Package (Tools->Library Package Manager->Package Manager Console). Прописуємо наступну рядок: Install-Package FluentNHibernate. Натискаємо Enter, і чекаємо закінчення установки FluentNHibernat'a.



Якщо потрібно встановити певну версію FluentNhibernate, то шукаємо рядок на сайті NuGet www.nuget.org/packages/FluentNHibernate/2.0.1 у таблиці Version.

1.2 Налаштування FluentNHibernate
  1. Відкриємо БД SQL Server Manager і створимо там БД «Biblioteca»
  2. Відкриємо Visual Studio, в папці Models» створимо клас «Book.cs»(Models->Book.cs)
  3. Створюємо в папку Models NHibernate і додаємо туди клас NHibernateHelper.cs(Models->NHibernate->NHibernateHelper.cs)
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Tool.hbm2ddl;

public class NHibernateHelper {
public static ISession OpenSession() {
ISessionFactory sessionFactory = Fluently.Configure()
//Налаштування БД. Рядок підключення до БД MS Sql Server 2008
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(@"Server=..\SQLENTERPRISE; initial catalog= Biblioteca; Integrated Security=SSPI;")
.ShowSql()
) 
//Маппінг. Використовуючи AddFromAssemblyOf NHibernate буде намагатися маппить КОЖЕН клас у цій збірці (assembly). Можна вибрати будь-який клас. 
.Mappings(m=>m.FluentMappings.AddFromAssemblyOf<Book>()) 
//SchemeUpdate дозволяє створювати/оновлювати в БД таблиці і поля (2 поле ==true) 
.ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true)) 
.BuildSessionFactory(); 
return sessionFactory.OpenSession();
}
}

1.3 Зв'язку, Класи, Маппинги
У проекті будуть створені наступні таблиці: Book, Author, Genre, Series і Mind.



1.3.1 Зв'язку
Один-к-одному — кожному екземпляру сутності А відповідає тільки один екземпляр сутності, і навпаки. Приклад, таблиці Book та Mind. Якщо я написав рецензію на книгу «Метро 2033», то я не можу застосувати точно таку ж рецензію на книгу «Метро 2034», а на «Метро 2033» не підійде моя рецензія на книгу «Метро 2034».

Зв'язок один-до-одного рідко застосовують, так як всі ці дані з успіхом можна помістити в одну таблицю. Її застосовують у тих випадках, якщо з якихось причин ви хочете одну таблицю розділити на дві таблиці. Приміром, ті поля, які часто виявляються порожніми, я розміщую в окрему таблицю.

«Один-до-багатьох» та «багато-до-одного» — кожному екземпляру сутності А відповідає 0, 1 або кілька екземплярів сутності, але кожному екземпляру сутності відповідає тільки один екземпляр сутності А. Приклад Book та Series. В одній серії/циклі може бути безліч книг, але сама книга може входити тільки в одну серію/цикл.

Яка ж різниця між зв'язками «один-до-багатьох» та «багато-до-одного»? Така ж, як між фразами «портфель учня» і «учень портфеля». Тобто важливо, хто у взаємовідносини двох об'єктів головний — учень або портфель.

«Багато-до-багатьох» — кожному екземпляру сутності А відповідає 0, 1 або кілька екземплярів сутності, і кожному екземпляру сутності відповідає 0, 1 або кілька екземплярів сутності А. Приклад Book та Author, Book та Genre. Над однією книгою, приміром, антологією, працює кілька авторів, але і у автора можуть бути кілька книг. Ці таблиці пов'язані один з одним за допомогою проміжних таблиць, таких як Book_Author іBook_Genre.

1.3.2 Клас Book і його Маппінг
Давайте створимо просте додаток, яке буде відображатися на веб-сторінці книзі, що зберігається в БД SQL Server. Заповнюємо клас Book і створюємо маппінг клас до нього.

using System;
using FluentNHibernate.Mapping;

namespace BibliotecaTutor.Models {
public class Book {
public virtual int Id { get; set; }
//Назва
public virtual string Name { get; set; }
//Опис
public virtual string Description { get; set; }
//Оцінка Світу фантастики
public virtual int MfRaiting { get; set; }
////Номери сторінок
public virtual int PageNumber { get; set; }
//Посилання на картинку
public virtual string Image { get; set; }
//Дата надходження книги (фільтр по новинок!)
public virtual DateTime IncomeDate { get; set; }
}
//Маппінг класу
public class BookMap : ClassMap<Book> {
public BookMap() {
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.Description);
Map(x => x.MfRaiting);
Map(x => x.PageNumber);
Map(x => x.Image);
Map(x => x.IncomeDate);
}
}
}

Для чого потрібен Маппінг? З його допомогою ми здійснюємо зв'язок даних класу Book з таблицею Book (яка буде трохи пізніше створена), змінюємо назви стовпців, визначаємо види зв'язків і так далі.

Після створення Моделі Book слід створити контролер(Controller->RClick->Add->Controller) і назывем його HomeController. Пишемо код, що виводить всі книги з таблиціBook.

public ActionResult Index()
{
using (ISession session = NHibernateHelper.OpenSession()) {
book = session.Query<Book>().ToList()
return View(book);
}
}

Далі створимо суворо типизированнное уявлення (View) в якому зобразимо всі записи з книг. (RClick на червону написView(book)->Add View). Ставимо галочки і вибираємо такі параметри, як на малюнку знизу (щоб Model Class можна вибрати зі списку Модель Book, билдим проект Build->Build Solution).



Відобразиться автоматично згенерований код, в якій відображаються всі поля класу Book. Після створення вистави, запустимо проект (F5). Відобразитися порожня сторінка.

Але якщо відкрити SQL Server Manager Studio і подивитися в БД Biblioteca, то там з'явиться таблиця Book. Заповнимо її даними.



(Можна змінити стовпці, приміром, Description зробити з nVarChar(255) у text або NVarChar(Max)).



Після цього поновіть сторінку, яка буде виглядати так, як на малюнку нижче.



Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.