В этом посте мы узнаем, как мы можем использовать NHibernate в приложении ASP.NET MVC.
Что такое NHibernate:
ORM (Object Relational Mapper) довольно популярны в наши дни. ORM — это механизм для сопоставления сущностей базы данных с объектами сущностей Class без написания кода для извлечения данных и написания некоторых SQL-запросов. Он автоматически генерирует SQL-запрос для нас и извлекает данные от нас.
NHibernate также является своего рода Object Relational Mapper, который является портом популярного Java ORM Hibernate. Он обеспечивает основу для отображения классов модели предметной области в традиционные реляционные базы данных. Это дает нам свободу написания повторяющегося кода ADO.NET, так как это будет действовать как уровень нашей базы данных. Давайте начнем с NHibernate.
Как загрузить:
Вы можете скачать этот ORM двумя способами. Из пакета nuget и с исходного сайта forge.
- Nuget — http://www.nuget.org/packages/NHibernate/
- Source Forge — http://sourceforge.net/projects/nhibernate/
Создание таблицы для CRUD:
Я собираюсь использовать SQL Server 2012 Express Edition в качестве базы данных. Ниже приведена таблица с четырьмя полями Id, Имя, Фамилия, Обозначение.
Создание проекта ASP.NET MVC для NHibernate:
Давайте создадим проект ASP.NET MVC для NHibernate, выбрав в меню Файл-> Новый проект-> ASP.NET MVC 4 приложение.
Установка пакета NuGet для NHibernate:
Я установил пакет nuget из консоли диспетчера пакетов с помощью следующей команды.
Он будет установлен следующим образом.
Файл конфигурации NHibertnate:
Nhibernate нужен один файл конфигурации для настройки соединения с базой данных и других деталей. Вам нужно создать файл с ‘hibernate.cfg.xml’ в папке модели Nhibernate вашего приложения со следующими деталями.
<?xml version="1.0" encoding="utf-8" ?> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <session-factory> <property name="connection.provider"> NHibernate.Connection.DriverConnectionProvider </property> <property name="connection.driver_class"> NHibernate.Driver.SqlClientDriver </property> <property name="connection.connection_string"> Server=(local);database=LocalDatabase;Integrated Security=SSPI; </property> <property name="dialect"> NHibernate.Dialect.MsSql2012Dialect </property> </session-factory> </hibernate-configuration>
Здесь у вас есть различные настройки для NHibernate. Вам необходимо выбрать класс драйвера, провайдера подключения в соответствии с вашей базой данных. Если вы используете другие базы данных, такие как Orcle или MySQL, у вас будет другая конфигурация. ThisNHibernate ORM может работать с любыми базами данных.
Создание класса модели для NHibernate:
Теперь пришло время создать класс модели для наших операций CRUD. Ниже приведен код для этого. Имя свойства идентично столбцам таблицы базы данных.
namespace NhibernateMVC.Models { public class Employee { public virtual int Id { get; set; } public virtual string FirstName { get; set; } public virtual string LastName { get; set; } public virtual string Designation { get; set; } } }
Создание файла отображения между классом и таблицей:
Теперь нам нужен файл сопоставления xml между классом и моделью с именем «Employee.hbm.xml», как в папке Nhibernate.
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" assembly="NhibernateMVC" namespace="NhibernateMVC.Models"> <class name="Employee" table="Employee" dynamic-update="true" > <cache usage="read-write"/> <id name="Id" column="Id" type="int"> <generator class="native" /> </id> <property name="FirstName" /> <property name="LastName" /> <property name="Designation" /> </class> </hibernate-mapping>
Создание класса для открытия сессии для NHibernate
Я создал класс в папке моделей под названием NHIbernateSession и статическую функцию, чтобы открыть сеанс для NHibertnate.
using System.Web; using NHibernate; using NHibernate.Cfg; namespace NhibernateMVC.Models { public class NHibertnateSession { public static ISession OpenSession() { var configuration = new Configuration(); var configurationPath = HttpContext.Current.Server.MapPath(@"~\Models\Nhibernate\hibernate.cfg.xml"); configuration.Configure(configurationPath); var employeeConfigurationFile = HttpContext.Current.Server.MapPath(@"~\Models\Nhibernate\Employee.hbm.xml"); configuration.AddFile(employeeConfigurationFile); ISessionFactory sessionFactory = configuration.BuildSessionFactory(); return sessionFactory.OpenSession(); } } }
Листинг:
Теперь у нас есть метод open session, готовый написать код контроллера для извлечения данных из базы данных. Ниже приведен код для этого.
using System; using System.Web.Mvc; using NHibernate; using NHibernate.Linq; using System.Linq; using NhibernateMVC.Models; namespace NhibernateMVC.Controllers { public class EmployeeController : Controller { public ActionResult Index() { using (ISession session = NHibertnateSession.OpenSession()) { var employees = session.Query<Employee>().ToList(); return View(employees); } } } }
Здесь вы можете видеть, что у меня есть сеанс с помощью метода OpenSession, а затем я запросил базу данных для получения базы данных сотрудника. Давайте создадим новый для этого, вы можете создать это с помощью правой кнопки мыши на представлении вышеупомянутого метода. Мы собираемся создать строго типизированное представление для этого. Наш экран листинга готов, как только вы запустите проект, он получит данные следующим образом.
Создать / Добавить:
Теперь пришло время написать добавить код сотрудника. Ниже приведен код, который я написал для этого. Здесь я использовал метод session.save, чтобы сохранить нового сотрудника. Первый метод — возврат пустого представления, а другой метод с атрибутом HttpPost сохранит данные в базе данных.
public ActionResult Create() { return View(); } [HttpPost] public ActionResult Create(Employee emplolyee) { try { using (ISession session = NHibertnateSession.OpenSession()) { using (ITransaction transaction = session.BeginTransaction()) { session.Save(emplolyee); transaction.Commit(); } } return RedirectToAction("Index"); } catch(Exception exception) { return View(); } }
Теперь давайте создадим строгий типизированный вид представления, щелкнув его правой кнопкой мыши и добавив вид. Как только вы запустите это приложение и нажмете «Создать новое», оно загрузит следующий экран.
Редактировать / Update:
Теперь давайте создадим функциональность редактирования с помощью NHibernate и ASP.NET MVC. Для этого я написал два метода результата действия: один раз для загрузки вида редактирования и другой для сохранения данных. Ниже приведен код для этого.
public ActionResult Edit(int id) { using (ISession session = NHibertnateSession.OpenSession()) { var employee = session.Get<Employee>(id); return View(employee); } } [HttpPost] public ActionResult Edit(int id, Employee employee) { try { using (ISession session = NHibertnateSession.OpenSession()) { var employeetoUpdate = session.Get<Employee>(id); employeetoUpdate.Designation = employee.Designation; employeetoUpdate.FirstName = employee.FirstName; employeetoUpdate.LastName = employee.LastName; using (ITransaction transaction = session.BeginTransaction()) { session.Save(employeetoUpdate); transaction.Commit(); } } return RedirectToAction("Index"); } catch { return View(); } }
Здесь в первом результате действия я выбрал существующего сотрудника с помощью метода get сеанса NHibernate, а во втором я получил и изменил текущего сотрудника с данными обновления. Вы можете создать вид для этого с помощью правой кнопки мыши -> добавить вид, как показано ниже. Я создал строго типизированное представление для редактирования. После запуска кода это будет выглядеть следующим образом.
Подробности:
Теперь пришло время создать подробный вид, где пользователь может видеть подробности сотрудника. Я написал следующую логику для просмотра деталей.
public ActionResult Details(int id) { using (ISession session = NHibertnateSession.OpenSession()) { var employee = session.Get<Employee>(id); return View(employee); } }
Вы можете добавить вид, как следует, щелкнув правой кнопкой мыши на действии. Теперь, когда вы запустите это в браузере, это будет выглядеть следующим образом.
Удалить:
Теперь пришло время написать код удаления функциональности. Следующий код, который я написал для этого.
public ActionResult Delete(int id) { using (ISession session = NHibertnateSession.OpenSession()) { var employee = session.Get<Employee>(id); return View(employee); } } [HttpPost] public ActionResult Delete(int id, Employee employee) { try { using (ISession session = NHibertnateSession.OpenSession()) { using (ITransaction transaction = session.BeginTransaction()) { session.Delete(employee); transaction.Commit(); } } return RedirectToAction("Index"); } catch(Exception exception) { return View(); } }
Здесь, в приведенном выше примере, первый результат действия будет иметь представление подтверждения удаления, а другой выполнит фактическую операцию удаления с использованием метода удаления сеанса. Когда вы запустите браузер, это будет выглядеть следующим образом. Вот и все. Очень легко работать с NHibernate. Оставайтесь с нами, чтобы узнать больше.