2012-07-25 25 views
1

概述

我想連線Autofac來幫助管理我的MVC 4 RC項目中的NHibernate的ISession。根據我的理解,Autofac應該按照我配置它的方式在每個HTTP請求的末尾調用ISession.Dispose(見下文)。但是,似乎並不是這種情況 - 如果我沒有撥打ISession.Flush(),數據不會保留在數據庫中。爲什麼我的ISession在使用Autofac時不會自動刷新?

配置

Autofac

container.Register(c => DbConfig.Generate(connectionString).BuildSessionFactory()) 
    .As<ISessionFactory>() 
    .SingleInstance(); 

container.Register(c => c.Resolve<ISessionFactory>().OpenSession()) 
    .As<ISession>() 
    .InstancePerLifetimeScope(); 

container.RegisterGeneric(typeof(Repository<>)) 
    .As(typeof(IRepository<>)) 
    .InstancePerLifetimeScope(); 

public class Repository<T> : IRepository<T> where T : class 
{ 
    protected readonly ISession Session; 

    public Repository(ISession session) 
    { 
     Session = session; 
    } 

    public void Add(T entity) 
    { 
     Session.Save(entity); 
    } 
} 

數據庫種子(的Application_Start)

public class DatabaseSeed 
{ 
    public static void Seed(IContainer container) 
    { 
     var session = container.Resolve<ISession>(); 
     var userRepo = container.Resolve<IRepository<User>>(); 
     userRepo.Add(new User { Id = 5, Name = "Test User" }); 

     //session.Flush(); <-- if not called, user will not be persisted! 
    } 
} 

閉幕詞

我知道我應該在交易中包裝這個。然而,我想在繼續研究更復雜的場景之前先掌握一些基礎知識,並且爲什麼上述方法不能按照我期望的方式工作,我感到困惑......

(作爲附註,我嘗試運行Autofac'profiler'這個Whitebox,但是它對我有些不正常(在Autofac group @ Google上發佈),所以我不完全確定它是Autfac,它取笑我還是NHibernate :-)

回答

3

提交事務將刷新會話。事務是基礎的一部分。

- 或 -

打開NHibernate的日誌和,你會看到,如果AutoFac部署的會議,如果NHibernate的刷新本身。

您配置了AutoFac,會話應放置在生命週期結束時。你在哪裏配置生命週期應該匹配一個http請求?


UPDATE

我只是測試它自己,如果會話配置會話沒有被刷新。這是有道理的,因爲您通常使用的事務將在會話處理之前提交。否則會話將在事務之外刷新。

因此,將flushmode設置爲「始終」或使用事務。就像我在我的原始答案中所說的,交易的一部分基礎知識。

+0

正如我所說,我知道將整個事情包裝在一個事務中並提交它可以解決問題,但我試圖理解爲什麼更簡單的解決方案似乎不夠用。 AFAIK InstancePerLifetimeScope在Web應用程序中使用時默認爲每個HTTP請求的實例。 – Dav 2012-07-25 09:30:34

+0

這就是爲什麼你可以打開NHibernate日誌記錄來查看它的功能。 – Jeroen 2012-07-25 09:31:14

+0

你的確說得對,'Dispose'本身並不會導致所有掛起的命令執行。我在想這可能是一些Autofac相關的,對象生存期的問題,但是由於測試的結果,我將db-init代碼移到了控制器中,並且經歷了相同的行爲。不知道我在哪裏得到了「Dispose」應該自動刷新的想法,除非另有說明......從其他人對互聯網上的評論中,交易確實被期望用作任何操作的標準部分。感謝您花時間回覆並測試! – Dav 2012-07-25 10:42:02

1

我對AutoFac一無所知,因爲我最喜歡的DI框架是Spring.NET及其XMLs :)。 但不知何故,改變對象的問題並沒有持續存在,這對我來說是非常熟悉的。在我得到的所有情況下,它們都與刷新模式和事務有關。我按照以下程序處理這些問題:

首先檢查是交易。它到位了嗎?強烈建議您至少在交易中進行所有更新/刪除操作。我們假設事務已經開始。

我們來到沖水模式。會話的沖洗模式是什麼?如果是Commit,則應該保持更改。如果它是Auto,則更改也必須持續。所以我認爲這是從不,這需要你使用Session.Flush()手動刷新它。

+0

麻煩的是我根本沒有使用事務,只是在做'ISession。保存(某物)'並且希望當'ISession'被丟棄時這最終會被刷新/保持。現在我有交易(仍然使用'FlushMode.Auto'),問題不復存在,我可以繼續討論更多有趣的事情:-) – Dav 2012-07-25 15:00:06

相關問題