Жизненный цикл NHibernate ISession; Когда можно создавать / размещать внутри каждого метода хранилища? - PullRequest
3 голосов
/ 02 февраля 2011

Я работаю с одноуровневыми , однопользовательскими приложениями, с FluentNHibernate .С несколькими потоками, запускаемыми по временным триггерам и по входящим сообщениям сокетов.

Какие требования будут определять, могу ли я создавать / распоряжаться ISession внутри каждого метода репозиториев или мне нужноподдерживать жизненный цикл ISession в течение нескольких вызовов, возможно, от начала и до конца программы?

Например, lazy-load требует, чтобы сеанс поддерживался?И если я не использую lazyload, по какой другой причине я должен поддерживать ISession?

В настоящее время мои методы хранилища выглядят так, как показано ниже, но мне интересно, если я делаю это неправильно ..

public class ProductRepository
{
    public void Delete(Product product)
    {
        using (ISession session = FNH_Manager.OpenSession())
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Delete(product);
                transaction.Commit();
            }
        }
    }

class FNH_Manager
{
    private static Configuration cfg;
    private static ISessionFactory sessionFactory;

    public static void ConfigureSessionFactory()
    {
        sessionFactory = CreateSessionFactory();
    }

    public static ISession OpenSession()
    {
        return sessionFactory.OpenSession();
    }

EDIT1: Попытка обработать "сеанс за вызов":

   public class EmployeeRepository
   {  
        public static void Delete(Employee employee)
        {
            using (ISession session = FNH_Manager.OpenSession())
            {
                using (ITransaction transaction = session.BeginTransaction())
                {
                    if (Employee.Id != 0)
                    {
                      var emp =  session.Get(typeof(Employee), employee.Id);
                      if (emp != null)
                      {
                        session.Delete(emp);
                        transaction.Commit();
                      }
                    }
                }
            }
        } 

Ответы [ 3 ]

5 голосов
/ 02 февраля 2011

Сессия должна быть открыта, когда вы ссылаетесь на лениво загруженное поле, поэтому, если вы полагаетесь на ленивую загрузку вне вашего хранилища, вам нужно будет управлять продолжительностью жизни сеанса где-то выше.

Если вы не используете отложенную загрузку, также возникает вопрос, нужно ли поддерживать несколько действий в одной транзакции. Например, если вы удаляете продукт И некоторые другие данные за один раз, вы бы хотели, чтобы это произошло в одной транзакции в том же сеансе (в противном случае вы можете удалить продукт, получить какой-то код, вызвать какое-то исключение и никогда не удалять другой данные, которые могут привести к появлению потерянных записей или повреждению вашей базы данных).

3 голосов
/ 02 февраля 2011

Я думаю, вам следует использовать шаблон UnitOfWork для каждого потока.В начале потока создайте ISession и инициализируйте им UnitOfWork.Хранилища используют UnitOfWork с этим знаком ISession.В конце выполнения потока передайте изменения или выполните откат, если возник конфликт с другими потоками.

1 голос
/ 02 февраля 2011

Продукт не связан ни с одним сеансом при удалении.Это так называемый отдельный объект.Чтобы использовать его в сеансе, например, удалив его, необходимо сначала связать его с текущим открытым сеансом.Есть несколько способов добиться этого:

  1. Держите сеанс открытым.Если при загрузке Прибора открывается тот же сеанс, что и при удалении, он будет работать нормально.
  2. Перезагрузите объект, но с использованием ISession.Get() или ISession.Load().
  3. Re-прикрепите объект к недавно открытому сеансу session с помощью ISession.Lock()

В противном случае вы, вероятно, получите StaleStateException s и т. п.

Помните, чтобы прочитать о документация NHibernate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...