2009-12-28 2 views
1

Я нашел то, что я считал great article от Ayende, при создании простого базового испытательного прибора для тестирования модулей NHib с использованием SQLite.Блок-схема блока NHibernate 101

Мой вопрос здесь - это код для испытательного образца в бетонном крепеже. В EX_1 ниже Айенде обертывает и сохранение выборки в транзакции, которую он совершает, и имеет Session.Clear между ними. Это работает, или курс, но также EX_2.

Все, что мне нравится, предпочитаю более компактный, читаемый EX_2. Любые мысли о том, почему дополнительный код в EX_1 стоит немного беспорядка?

Приветствия,
Berryl

==== EX_1 =====

[Fact] 
public void CanSaveAndLoadBlog_EX_1() 
{ 
    object id; 

    using (var tx = session.BeginTransaction()) 
    { 
     id = session.Save(new Blog 
     { 
      AllowsComments = true, 
      CreatedAt = new DateTime(2000,1,1), 
      Subtitle = "Hello", 
      Title = "World", 
     }); 

     tx.Commit(); 
    } 

    session.Clear(); 


    using (var tx = session.BeginTransaction()) 
    { 
     var blog = session.Get<Blog>(id); 

     Assert.Equal(new DateTime(2000, 1, 1), blog.CreatedAt); 
     Assert.Equal("Hello", blog.Subtitle); 
     Assert.Equal("World", blog.Title); 
     Assert.True(blog.AllowsComments); 

     tx.Commit(); 
    } 
} 

==== EX_2 =====

[Fact] 
    public void CanSaveAndLoadBlog_EX_2() 
    { 
     var id = session.Save(new Blog 
           { 
            AllowsComments = true, 
            CreatedAt = new DateTime(2000, 1, 1), 
            Subtitle = "Hello", 
            Title = "World", 
           }); 

     var fromDb = session.Get<Blog>(id); 

     Assert.Equal(new DateTime(2000, 1, 1), fromDb.CreatedAt); 
     Assert.Equal("Hello", fromDb.Subtitle); 
     Assert.Equal("World", fromDb.Title); 
     Assert.True(fromDb.AllowsComments); 

    } 

ответ

1

Верую NHibernate рекомендуется использовать транзакции, даже если вы только запрашиваете. Проверьте эту статью http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions.

Также ваш код EX_2 может не попасть в базу данных в зависимости от того, какой тип первичного ключа вы используете. Если вы используете ключ Identity, который автоинкремент, NHibernate попадет в базу данных и получит первичный ключ, но если вы используете guid, guid.comb или hilo, вы вообще не попадете в базу данных. Таким образом, ваш Get будет захватывать то, что NHibernate кэшируется в памяти, если вы не совершаете изменения фиксации, а затем очищаете сеанс, чтобы вы знали, что у вас ничего нет в памяти.

+0

@ Emmanuel - Я не знал, что всегда используют транзакции для операций чтения с Hibernate. Спасибо, что указали это. Глава 11.2 документов, похоже, подтверждает это также (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html) «Всегда используйте четкие границы транзакций даже для чтения операции «. – dcp