?

Log in

No account? Create an account

Previous Entry | Next Entry

Итак приступим. Что у нас есть? У нас БД. Допустим на MSSql сервере, скажем 2005, но это не важно. БД любая. Пишем на C# под 2005 VS. Итак что же нам надо что бы все хорошо сделать?
1. Программка MyGeneration(далее майген или МГ). Я использую версию 1.3
2. Шаблон NHibernate Object Mapping автора k-dub.
Все эти вещи берем тут.

Ставим МГ. Запускаем. Настраиваем подключение к нашей БД. Выбираем шаблон и запускаем.
Появится окно:

Выбираем NameSpace для классов. Префикс для скрытых членов класса. Требуемые таблицы. И остальные настройки по своему усмотрению. Жмем ок. У нас сгенерится hbm.xml файлы и классы для хибера.

Далее создаем проект в студии. Для удобства создаем новую папку в сборке. Скажем Objects. И добавляем туда все сгенерированные файлы. ИМЕННО ВСЕ!
Далее нам надо указать у всех hbm.xml файлов что они являются Embedded Resource. Это делается в свойствах файла.
Ну вот объекты готовы. Отлично. Хлопаем в ладоши, хаваем булочки. Но нам надо настроить хибер на работу с БД и связать его с объектами.
Добавляем хиберовские сборки. Где их взять? Тут.
Нужны следующие сборки:
NHibernate.dll
Также нам нужно создать файл настроек приложения. Туда следующее:
*********************************************
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
 
  <nhibernate>
    <add   key="hibernate.show_sql"   value="true"  />
    <add   key="hibernate.connection.provider"   value="NHibernate.Connection.DriverConnectionProvider"  />

    <add   key="hibernate.dialect"   value="NHibernate.Dialect.MsSql2000Dialect"  />
    <add   key="hibernate.connection.driver_class"   value="NHibernate.Driver.SqlClientDriver"  />
    <add   key="hibernate.connection.connection_string"   value="Data Source=kn002\sqlexpress;Initial Catalog=Diplom;Integrated Security=True"  /> 

  </nhibernate>

</configuration>
*********************************
Смотрим все ли совпадает. У мну хибер 1.2.0
В теге
<add   key="hibernate.connection.connection_string"   value="Data Source=kn002\sqlexpress;Initial Catalog=Diplom;Integrated Security=True"  />  указываем путь к своей БД. Диалект можно поставить 2005.
Теперь можно создать класс контроллер, который будет позволять нам работать с объектами хибера.
Пример:
***************************************************
using NHibernate;
using NHibernate.Cfg;
using WindowsApplication2.Objects;

namespace WindowsApplication2
{
    public class DataController
    {

        private ISessionFactory _sessions;

        public DataController()
        {
            Configuration cfg = new Configuration();
            cfg.AddClass(typeof (DataElement));
            cfg.AddClass(typeof(Pins));
            cfg.AddClass(typeof (WindowsApplication2.Objects.Properties));
            cfg.AddClass(typeof(Library));
            _sessions = cfg.BuildSessionFactory();
            //new SchemaExport(cfg).Create(true, true);//Для создания бд раскоментить
        }

        public int SaveElement(DataElement el)
        {
            ISession session = _sessions.OpenSession();
            ITransaction tx = null;
            try
            {
                tx = session.BeginTransaction();
                int ID = (int)session.Save(el);
                tx.Commit();
                return ID;

            }
            catch (HibernateException e)
            {
                if (tx != null) tx.Rollback();
                throw e;
            }
            finally
            {
                session.Close();
            }
        }

    }
}
*******************************************
Извините за названия сборок.)
Что тут происходит? В конструкторе контроллера мы начинаем конфигурировать хибернейт. И строим сессию исходя из конфига.
Закоменченная строка позволяет создавать БД, исходя из конфига. Мы добавляем наши классы хибера
cfg.AddClass(typeof (DataElement)); и так для каждого класса хибера.

Также тут представлен метод сохранения объекта. Работаем с хибером следующем образом:
Открываем сессию. Начинаем транзакцию. Делаем что нам нужно. Подтверждаем транзакцию. Если ошибки, отколоняем транзакцию. И всегда закрываем сессию. Для работы метода передаем хиберовский объект.
Разберемся получше с объектами хибернейта.
Маппинг:
**********************
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Diplom.Data.Pins,Diplom.Data" table="Pins" lazy="false" >

        <id name="Id" column="ID" type="Int32" unsaved-value="0">
            <generator class="native"/>
        </id>
        <property column="X" type="Int32" name="X" />
        <property column="Y" type="Int32" name="Y" />
        <many-to-one name="FkElement" column="FKElement" class="Diplom.Data.DataElement,Diplom.Data" />
        <property column="Number" type="Int32" name="Number" />
       
    </class>
</hibernate-mapping>

**********************
<id name="Id" column="ID" type="Int32" unsaved-value="0">
            <generator class="native"/>
        </id>
это описание PK. Name - имя в классе хибера. Column - имя в БД. И выбираем тип генератора. О всех генераторах смотри в доках по хиберу.
<property column="Y" type="Int32" name="Y" /> описание столбца. Тоже самое все.
<many-to-one name="FkElement" column="FKElement" class="Diplom.Data.DataElement,Diplom.Data" /> описание FK. Имя в классе. Имя в БД. И класс на который ключ ссылается.
В классе объекта хибера, все паблик методы должны быть виртуальными! В маппинге обрати внимание на <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> Должно быть именно 2.2. в нашей версии хибера.
В маппинге объектов <class name="WindowsApplication2.Objects.DataElement,WindowsApplication2" table="DataElement"> имя класса дается следующим образом: Полностью Namespace класса + имя класса, после запятой имя сборки. Так для всех указаний на классы.
Так же отмечу что шаблон немного надо подправить будет, который используется в МГ при генерировании объектов. Надеюсь проблем у вас при это не возникнет. Но если надо, могу выложить.
Ну вот в принципе небольшой пример по поводу того как начать быстро работать с хибером. Я рассказывал именно о том как начать быстро работать, а не о том как устроен хибер. Будут вопросы, всегда отвечу.)

Comments

( 2 комментария — Оставить комментарий )
az_spb_ru
7 апр, 2008 16:23 (UTC)
Для начала неплохо бы чтобы было написано, что это вообще и зачем это нужно
Александр Крупский
10 окт, 2012 14:35 (UTC)
NHibernate
Статьи на тему NHibernate хорошо вышли. Но у меня есть ряд вопросов, вы можете со мной связаться, по ICQ 613938786.
Буду ждатьь
( 2 комментария — Оставить комментарий )