powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / nHibernate, потокобезопасность
15 сообщений из 15, страница 1 из 1
nHibernate, потокобезопасность
    #37565300
GrasQtR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую всех, возник вопрос по использованию nHibernate. Есть следующий код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public void Add(Entity entity)
{
    using (ISession session1 = Test.SessionFactory.OpenSession())
    {
        using (ITransaction trans = session1.BeginTransaction())
        {
            using (ISession session2 = Test.SessionFactory.OpenSession())
                if (session2.Get<Entity>(entity.id) == null)
                {
                    session1.Save(entity);
                    trans.Commit();
                }
        }
    }
}


Является ли такой код корректным и потокобезопасным? Возможно ли использование вложенной сессии в транзакцию?
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565430
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrasQtR,

ISessionFactory - потокобезопасна.
ISession - не потокобезопасна.

Ваш код потокобезопасен, т.к. в нём ничего не шариться между потоками.
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565434
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

Хотя нафига открывать вторую сессию - не понятно. Чем одна не угодила?
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565465
GrasQtR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

> Хотя нафига открывать вторую сессию - не понятно. Чем одна не угодила?

Если использовать одну сессию, получается вот такая неприятность: "a different object with the same identifier value was already associated with the session..."
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565482
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrasQtR,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    
using (ISession session1 = Test.SessionFactory.OpenSession())
    {
        using (ITransaction trans = session1.BeginTransaction())
        {
		session1.Persist(entity);
                trans.Commit();

        }
    }


А так?
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565546
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В идеале нужно открывать сессию при создании репозитория, а не в его методах (Add и иже). Но и так сойдет.
Закрывать сессию по IDisposable репозитория.
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565554
GrasQtR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorGrasQtR,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    
using (ISession session1 = Test.SessionFactory.OpenSession())
    {
        using (ITransaction trans = session1.BeginTransaction())
        {
		session1.Persist(entity);
                trans.Commit();

        }
    }


А так?

Появляется такая ошибка: "detached entity passed to persist".
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565564
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrasQtR,

В общем от шаблона сессия на операцию одни проблемы. Держите сессию всё время, пока работаете с объектом. Закончили работу - закомитили транзакцию.

но даже в вашем случае можно спасти ситуацию:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
using (ISession session1 = Test.SessionFactory.OpenSession())
{
  using (ITransaction trans = session1.BeginTransaction())
  {
    session1.Merge(entity);
    trans.Commit();
  }
}
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565587
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите содержимое свойства Test.SessionFactory . Похоже, что у Вас одна сессия на несколько потоков.
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565597
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Неправда ваша. "detached entity passed to persist" скорее всего означает, что он пытается сохранить сущность, которая имеет ссылку на другую сущность. И другая сущность не связана с сессией.
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565610
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorАлексей К,

Неправда ваша. "detached entity passed to persist" скорее всего означает, что он пытается сохранить сущность, которая имеет ссылку на другую сущность. И другая сущность не связана с сессией.Согласен.
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565623
GrasQtR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

Хорошо, я сделаю одну сессию на репозиторий. Тогда вопрос следующий: как правильно проводить проверку на существование в базе сущности перед добавлением или удалением? Видимо, я что-то делаю неправильно.
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565703
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrasQtRSolYUtor,

как правильно проводить проверку на существование в базе сущности перед добавлением или удалением?

А зачем ее проводить? Session.Persist(), и дело с концом. NHibernate далее сам разберётся, новая сущность или существующая,и cгенерирует соответственно insert или update.
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565761
GrasQtR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorGrasQtRSolYUtor,

как правильно проводить проверку на существование в базе сущности перед добавлением или удалением?

А зачем ее проводить? Session.Persist(), и дело с концом. NHibernate далее сам разберётся, новая сущность или существующая,и cгенерирует соответственно insert или update.

А если будет попытка удаления несуществующего объекта в методе Remove?
...
Рейтинг: 0 / 0
nHibernate, потокобезопасность
    #37565771
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrasQtRА если будет попытка удаления несуществующего объекта в методе Remove?

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


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