Библиотека NHibernateНедавно, в своей профессиональной деятельности, я столкнулся с необходимостью организации быстрого, и легкого в реализации доступа к данным бд, причем, настолько быстрого, чтобы даже особо sql запросы писать не надо было.
Тут на помощь пришла библиотека NHibernate, являющаяся реализацией под технологию .NET библиотеки Hibernate под Java. Данная библиотека интересна тем, что скрывает всю работу с базой данных, вплоть до установления соединений. Оперировать приходится с объектами классов, описывающих конкретные сущности базы данных. Правда удобно?
Надо всего лишь написать классы, отвечающие определенным требованиям, создать для них xml файл с описанием сущностей и отношений, между ними… и вуаля, NHibernate автоматически сгенерирует sql запросы для выгрузки и записи обьектов.
Итак, приведу легкий пример использования: Допустим у нас есть простенькая табличка PRICE с прайс-листами со следующими колонками:
Id (PK, int, not null) FromDate (datetime, not null) ToDate (datetime, not null) Comment (nvarchar(max), null)
1. Для начала нам собственно понадобиться сама библиотека, которая лежит по адресу http://www.hibernate.org/6.html 2. Далее, создать Web project и добавить туда ссылку на библиотеку NHibernate. dll. 3. Теперь надо сконфигурировать доступ NHibernate к базе данных. Для этого в конфиге Web. config надо написать строчки типа:
<?xml version="1. 0" encoding="utf-8"?><configuration><configSections><sectionname="hibernate-configuration" type="NHibernate. Cfg. ConfigurationSectionHandler, NHibernate"/> </configSections><hibernate-configuration xmlns="urn:nhibernate-configuration-2. 2"> <session-factory> <property name="dialect">NHibernate. Dialect. MsSql2005Dialect </property> <property name="connection. provider">NHibernate. Connection. DriverConnectionProvider </property> <property name="connection. connection_string"> Server=(local);initial catalog=prices; Integrated Security=SSPI </property> <mapping assembly="Prices" /> </session-factory> </hibernate-configuration> <system. web> ... </system. web> </configuration>
4. Создать класс PriceList. cs, описывающий сущность. При этом надо учитывать, что все свойства должны быть виртуальными: public class PriceList{private int id;private DateTime fromDate; private DateTime toDate; private string comment; public PriceList() { } public PriceList(DateTime fromDate, DateTime toDate) { this. fromDate = fromDate; this. toDate = toDate; } public RedPriceList(DateTime fromDate, DateTime toDate, string comment) { this. fromDate = fromDate; this. toDate = toDate; this. comment = comment; } public static readonly string IdPropertyName = "Id"; public virtual int Id { get { return id; } set { id = value; } } public static readonly string FromDatePropertyName = "FromDate"; public virtual System. DateTime FromDate { get { return fromDate; } set { fromDate = value; } } public static readonly string ToDatePropertyName = "ToDate"; public virtual System. DateTime ToDate { get { return toDate; } set { toDate = value; } } public static readonly string CommentPropertyName = "Comment"; public virtual string Comment { get { return comment; } set { comment = value; } } public override bool Equals(object obj) { return id == ((PriceList)obj). id; } public override string ToString() { return id. ToString(); } }
5. Сделать обёртку в виде xml файла PriceList. hbm. xml: <hibernate-mapping xmlns="urn:nhibernate-mapping-2. 2" assembly="Prices" namespace="Prices"> <class name="PriceList" table="PRICE"><id name="Id" column="Id"> <generator class="native"> </generator> </id> <property name="FromDate" column="FromDate" type="DateTime" not-null="true"></property> <property name="ToDate" column="ToDate" type="DateTime" not-null="true"></property> <property name="Comment" column="Comment" type="string" not-null="false"></property> </class> </hibernate-mapping>
Тут вроде всё должно быть понятно, указываем соответствие названий свойств класса и колонок таблицы, а также их тип. Как можно видеть, идентификатор в этом случае описывается отдельно, причем в теге generator в атрибуте class указывается, что будет использована встроенная генерации идентификаторов.
Есть возможность создать свой класс генерации идентификаторов, который обязан реализовать интерфейс NHibernate. Id. IIdentifierGenerator. Кстати, не забудьте указать в свойствах этого xml файла Build Action = Embedded Resource! Иначе NHibernate не сможет использовать ваш описатель класса. А теперь данный файл будет включен в итоговую сборку.
6. Далее надо запускать NHibernate интерфейс ISession. Этот интерфейс используется для сохранения и извлечения обьектов из базы. Его необходимо получать из ISessionFactory. ISessionFactory отвечает за одну базу данных, используя данные из конфигурационного файла. Данный интерфейс создается однажды, при запуске в обработчике Application_Start. Следовательно, нам нужно иметь доступ к этому обьекту из всего приложения. Для реализации данной функциональности очень подходит паттерн Singleton.
Напишем класс доступа к ISessionFactory:using System; using System. Web; using NHibernate; using NHibernate. Cfg;
namespace NhibernatePreview { public sealed class NHibernateHelper { private const string CurrentSessionKey = "nhibernate. current_session"; private static readonly ISessionFactory sessionFactory; static NHibernateHelper() { sessionFactory = new Configuration(). Configure(). BuildSessionFactory(); } public static ISession GetCurrentSession() { HttpContext context = HttpContext. Current; ISession currentSession = context. Items[CurrentSessionKey] as ISession;
if (currentSession == null) { currentSession = sessionFactory. OpenSession(); context. Items[CurrentSessionKey] = currentSession; } return currentSession; } public static void CloseSession() { HttpContext context = HttpContext. Current; ISession currentSession = context. Items[CurrentSessionKey] as ISession;
if (currentSession == null) { // No current session return; }
currentSession. Close(); context. Items. Remove(CurrentSessionKey); }
public static void CloseSessionFactory() { if (sessionFactory != null) { sessionFactory. Close(); } } } }
Теперь в приложении можно написать следующие строки, которые показывают всю мощь этой библиотеки:
Таким образом, мы только что создали обьект PriceList и сохранили его в базе данных. Теперь в таблице есть строка с этими данными. При этом не написав ни одного запроса. Как можно, заметить, удобство на лицо.
Nhibernate является чрезвычайно удобным средством для создания Data Access Layer. Вернутся Вам будет интересно:
|
- Публикации
Итак, у вас имеется свой собственный форум, но его никто не посещает? Мы готовы помочь вам справиться с этой нелегкой проблемой.
Данная статья в основном рассчитана на тех, кто самостоятельно занимается продвижением своего проекта.
Проклял все настройки кодировок, проклял DirectAdmin и еле-еле нашел то место где располагается и задается общий пароль для ...
Твиттер уже давно стал из нового web 2. 0 сервиса рекламной площадкой с огромным количеством потенциальных пользователей ...
Самое время кратко описать, чем нам придется заниматься. Прежде всего нужно понять, что блог ты будешь делать для получения ...
Долго не знал с чего начать данную статью. Статья что-то типа мыслей вслух и философии.