powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / FireBird + NHibernate - Создаем первый проект
8 сообщений из 8, страница 1 из 1
FireBird + NHibernate - Создаем первый проект
    #36568292
Alexus_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создаю первый проект NHibernate + FireBird. Потратил уже море времени и нервов. Планирую сделать тему - упорядоченным описанием процесса создания приложения с нуля.
...
Рейтинг: 0 / 0
FireBird + NHibernate - Создаем первый проект
    #36568444
Alexus_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, делаем БД, диалект 1.
Создаем таблицу с генератором/тригером для автоинкремента
скрипт таблицы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE GENERATOR GEN_BOOK_ID;

CREATE TABLE BOOK (
    ID     INTEGER NOT NULL,
    TITLE  VARCHAR( 255 ) NOT NULL,
    ISBN   VARCHAR( 255 )
);
SET TERM ^ ;

/* Trigger: BOOK_BI */
CREATE OR ALTER TRIGGER BOOK_BI FOR BOOK
ACTIVE BEFORE INSERT POSITION  0 
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_BOOK_ID, 1 );
END
^

SET TERM ; ^



Теперь займемся приложением.

Создаем проект WinForms в VS 2008


Копируем в debug папку к exe шнику файлы dll

Содержимое папки NHibernate-2.1.2.GA-bin\Required_Bins
Antlr3.Runtime.dll
Iesi.Collections.dll
Iesi.Collections.xml
log4net.dll
log4net.xml
NHibernate.dll
NHibernate.xml

затем из
NHibernate-2.1.2.GA-bin\Required_For_LazyLoading\LinFu\
LinFu.DynamicProxy.dll
NHibernate.ByteCode.LinFu.dll

а также
FirebirdSql.Data.FirebirdClient.dll -
FirebirdClient - ADO.NET Data Provider версии 2.5.2.0


все dll подключаем в referenсes

приступаем к конфигурированию
создаем hibernate.cfg.xml в папке с dll и exe

наполняем в соответствии с шаблоном следующим

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  <session-factory name="NHibernate.Test">
    <property name="connection.driver_class">NHibernate.Driver.FirebirdClientDriver</property>
    <property name="connection.connection_string">
      Server=localhost;
      Database=c:\BD\nhibernate.fdb;
      user=SYSDBA;Password=masterkey;
    </property>
    <property name="show_sql">true</property>
    <property name="dialect">NHibernate.Dialect.FirebirdDialect</property>
    <property name="command_timeout"> 60 </property>
    <property name="query.substitutions">true  1 , false  0 , yes  1 , no  0 </property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
    <property name="generate_statistics">true</property>
    <mapping assembly="FireTest"/>
  </session-factory>
</hibernate-configuration>



создаем класс для описания сущности
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
namespace FireTest.Domain
{
    public class Book
    {
        public virtual int ID { get; set; }
        public virtual string ISBN { get; set; }
        public virtual string TITLE { get; set; }
    }
}


теперь маппинг класса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="FireTest.Domain.Book, FireTest" table="BOOK" lazy="true" >
    <id name="ID" column="ID" type="Int32" unsaved-value="0">
      <generator class="sequence">
        <param name="sequence">GEN_BOOK_ID</param>
        </generator>
      </id>
    <property name="ISBN" not-null="false" length="255" type="string" />
    <property name="TITLE" not-null="true" length="255" type="string" />
  </class>
</hibernate-mapping>



добавляем в проект
делаем xml мапинга в свойствах build action = Embedded Resource, кладем рядом с Book.cs

теперь берем готовый проверенный в другом проекте код для удобной работы с hiber
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
using System;
using System.Collections.Generic;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;

namespace FireTest.Code
{
    /// <summary>
    /// Класс, через который осуществляется доступ к БД.
    /// </summary>
    public class DatabaseController
    {
        /// <summary>
        /// Конфигурация NHibernate.
        /// </summary>
        public Configuration Configuration { get; set; }
        /// <summary>
        /// Фабрика сессий NHibernate.
        /// </summary>
        public ISessionFactory Factory { get; set; }
        /// <summary>
        /// Открытая сессия.
        /// </summary>
        public ISession Session { get; set; }

        /// <summary>
        /// Конструктор. В нём происходит полная начальная установка моединения (конфигурируется связь, создаётся фабрика сессий и инициализируется сессия).
        /// </summary>
        public DatabaseController()
        {
            Init();
        }

        /// <summary>
        /// Полная начальная установка моединения (конфигурируется связь, создаётся фабрика сессий и инициализируется сессия)
        /// </summary>
        private void Init()
        {
            Configuration = new Configuration().Configure(); //берётся из файла конфигурации - web.config или app.config
            Factory = Configuration.BuildSessionFactory();
            Session = Factory.OpenSession();
        }

        /// <summary>
        /// Закрытие всех открытых соединений.
        /// </summary>
        public void Close()
        {
            Session.Flush();
            Session.Close();
            Factory.Close();
        }

        /// <summary>
        /// Реинициализация сессии для сброса кэша.
        /// </summary>
        public void ReInitSession()
        {
            Session.Flush();
            Session.Close();
            Session = Factory.OpenSession();
        }

        /// <summary>
        /// Сброс БД и создание её заново.
        /// </summary>
        public void RecreateDatabase()
        {
            new SchemaExport(Configuration).Drop(true, true);
            new SchemaExport(Configuration).Create(true, true);
        }

        /// <summary>
        /// Получить все записи указанного типа.
        /// </summary>
        /// <typeparam name="T">Тип получаемых записей.</typeparam>
        /// <returns>Список записей.</returns>
        public IList<T> GetAll<T>() where T : class
        {
            return Session.CreateCriteria<T>().List<T>();
        }

        /// <summary>
        /// Сохранение в БД записи указанного типа.
        /// </summary>
        /// <typeparam name="T">Тип сохраняемой записи.</typeparam>
        /// <param name="val">Сохраняемая запись</param>
        public void Save<T>(T val) where T : class
        {
            Session.Save(val);
            Session.Flush();
        }

        /// <summary>
        /// Загрузка из БД записи указанных типа по идентификатору.
        /// </summary>
        /// <typeparam name="T">Тип загружаемой записи.</typeparam>
        /// <param name="id">Идентификатор загружаемой записи.</param>
        /// <returns>Загруженная запись.</returns>
        public T Load<T>(Guid id) where T : class
        {
            return Session.Load<T>(id);
        }

        /// <summary>
        /// Загрузка из БД записи указанных типа по идентификатору.
        /// </summary>
        /// <typeparam name="T">Тип загружаемой записи.</typeparam>
        /// <param name="id">Идентификатор загружаемой записи.</param>
        /// <returns>Загруженная запись.</returns>
        public T Load<T>(int id) where T : class
        {
            return Session.Load<T>(id);
        }

        /// <summary>
        /// Обновление указанной записи в БД.
        /// </summary>
        /// <typeparam name="T">Тип обновляемой записи.</typeparam>
        /// <param name="val">Обновляемая запись.</param>
        public void Update<T>(T val) where T : class
        {
            Session.Update(val);
            Session.Flush();
        }

        /// <summary>
        /// Удаление из БД указанной записи.
        /// </summary>
        /// <typeparam name="T">Тип удаляемой записи.</typeparam>
        /// <param name="val">Удаляемая запись.</param>
        public void Delete<T>(T val) where T : class
        {
            Session.Delete(val);
            Session.Flush();
        }
    }
}


наконец сами что нибудь делаем с базой, наполнив ее перед этим

- обработчик кнопки на главной форме
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
private void button1_Click(object sender, EventArgs e)
        {
            DatabaseController Controller;
            int y;
            Controller = new DatabaseController();
            // Book b = new Book();
            y = Controller.GetAll<Book>().Count;
            //string t = Controller.Load<Book>(13).ISBN;
            MessageBox.Show(y.ToString());
            //MessageBox.Show(t);

        }


и пытаемся запустить.
странно..работает.. показывает в моем случае - 2 книги..
до этого я делал тоже самое 4 раза..не работало..то не надйен persistenr object..то еще что то..то еще... :'(
а теперь работает... ура товарищи..УРА. буду описывать следующие действия..пусть это будет типа руководства для таких же как я.
...
Рейтинг: 0 / 0
FireBird + NHibernate - Создаем первый проект
    #36568491
Alexus_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Также работает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
//чтение
private void button2_Click(object sender, EventArgs e)
        {
            DatabaseController Controller;
            Controller = new DatabaseController();
            string t = Controller.Load<Book>(2).ISBN;
            MessageBox.Show(t);
        }
//запись
        private void button3_Click(object sender, EventArgs e)
        {
            DatabaseController Controller;
            Book b = new Book
                         {
                             ISBN = "i3",
                             TITLE = "t3"
                         };
            Controller = new DatabaseController();
            Controller.Save<Book>(b);
            Controller.ReInitSession();
            int y = Controller.GetAll<Book>().Count;
            MessageBox.Show(y.ToString());
        }
...
Рейтинг: 0 / 0
FireBird + NHibernate - Создаем первый проект
    #36862624
Misho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexus_ru,
Ну как дальнейшие успехи по этой теме?
Тоже пытаюсь делать с нуля клиент-сервер C# - Firebird.
Причем первое осваиваю...
Терзаюсь насчет всякого рода ORM... или бог с ним -
через DataSet-ы делать?
...
Рейтинг: 0 / 0
FireBird + NHibernate - Создаем первый проект
    #36984569
Alexus_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misho,

Давно я тут не был.
Лучше через ORM, снимется целая масса проблем. Через DataAdapter, Query, DataSet работать - тоска. Уже давно этим не занимаюсь. Так что - делать прямо как в этой теме, и все должно быть хорошо. Также можно использовать EntityFramework, установив соответствующие дрова ADO.NET
...
Рейтинг: 0 / 0
FireBird + NHibernate - Создаем первый проект
    #37336674
ostoha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже новичёк в этом всём, так вот у меня ошибка в "DatabaseController.cs" при нажатии на кнопку
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
private void button1_Click(object sender, EventArgs e)
        {
            DatabaseController Controller;
            int y;
            Controller = new DatabaseController();
            // Book b = new Book();
            y = Controller.GetAll<Book>().Count;
            //string t = Controller.Load<Book>(13).ISBN;
            MessageBox.Show(y.ToString());
            //MessageBox.Show(t);

        }
Показывает ошибку на строчке:
Configuration = new Configuration().Configure(); //берётся из файла конфигурации - web.config или app.config

Пишит:
{"Could not add assembly FireTest"}
{"Невозможно загрузить файл или сборку \"FireTest\" или один из зависимых от них компонентов. Не удается найти указанный файл.":"FireTest"}
Could not add assembly FireTest
...
Рейтинг: 0 / 0
FireBird + NHibernate - Создаем первый проект
    #37336675
ostoha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите разобраться.
...
Рейтинг: 0 / 0
FireBird + NHibernate - Создаем первый проект
    #37409197
Alexus_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ostoha,

Возможно, уже неактуально :)

Рекомендую проверить маппинг (жирным - FireTest)

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="FireTest.Domain.Book, FireTest " table="BOOK" lazy="true" >
<id name="ID" column="ID" type="Int32" unsaved-value="0">
<generator class="sequence">
<param name="sequence">GEN_BOOK_ID</param>
</generator>
</id>
<property name="ISBN" not-null="false" length="255" type="string" />
<property name="TITLE" not-null="true" length="255" type="string" />
</class>
</hibernate-mapping>


и hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<property name="connection.driver_class">NHibernate.Driver.FirebirdClientDriver</property>
<property name="connection.connection_string">
Server=localhost;
Database=c:\BD\nhibernate.fdb;
user=SYSDBA;Password=masterkey;
</property>
<property name="show_sql">true</property>
<property name="dialect">NHibernate.Dialect.FirebirdDialect</property>
<property name="command_timeout">60</property>
<property name="query.substitutions">true 1, false 0, yes 1, no 0</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
<property name="generate_statistics">true</property>
<mapping assembly=" FireTest "/>
</session-factory>
</hibernate-configuration>


Вероятно в Вашем проекте основной namespace, имя проекта другое, должны совпадать.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / FireBird + NHibernate - Создаем первый проект
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]