2013-07-30 74 views
0

我試圖與NHibernate的內存測試使用,我成功地做,在這個小項目: https://github.com/demojag/NHibernateInMemoryTestNHibernate的InMemory測試

你可以從對象的地圖看,我不得不評論此line: //SchemaAction.None();測試將失敗。此選項隱藏模式導出。

這個評論只是我猜我做了因爲到目前爲止我還沒有找到有關Schema Actions的嚴肅文檔。

我正在做這些測試,因爲我有一個現有的情況,我想在內存中測試,但所有的實體映射都有選項SchemaActions.None(),當我嘗試執行內存測試時,我得到很多「沒有這樣的桌子」。

我想知道是否存在一種方法來將Schema操作選項設置爲none並導出架構呢? (我知道這可能是一個封裝違規,所以它不會有很多意義)。

我想離開這個選項設置爲none,因爲是一個「DatabaseFirst」應用程序,我不能冒險放棄數據庫,並在每次構建配置時重新創建它,但我想,如果在配置中我沒有指定指令「exposeConfiguration」和SchemaExport,我可以很安全。

謝謝你的建議

朱塞佩。

回答

0

您應該能夠通過NHibernate.Cfg.Configuration.BeforeBindMapping事件覆蓋HBM或Fluent NHibernate映射中的任何和所有設置,該事件爲您提供編程運行時訪問NHibernate內部模型的映射。請參閱下面的示例,它設置了BeforeBindMapping事件處理程序,該事件處理程序將映射中指定的SchemaAction重寫爲任何您想要的內容。

public NHibernate.Cfg.Configuration BuildConfiguration() 
{ 
    var configuration = new NHibernate.Cfg.Configuration(); 

    configuration.BeforeBindMapping += OnBeforeBindMapping; 

    // A bunch of other stuff... 

    return configuration; 
} 

private void OnBeforeBindMapping(object sender, NHibernate.Cfg.BindMappingEventArgs bindMappingEventArgs) 
{ 
    // Set all mappings to use the fully qualified namespace to avoid class name collision 
    bindMappingEventArgs.Mapping.autoimport = false; 

    // Override the schema action to all 
    foreach (var item in bindMappingEventArgs.Mapping.Items) 
    { 
     var hbmClass = item as NHibernate.Cfg.MappingSchema.HbmClass; 

     if (hbmClass != null) 
     { 
      hbmClass.schemaaction = "all"; 
     } 
    } 
} 
+0

我沒有得到任何結果與:(.. 但我的問題是,是否有必要嗎?我的意思是,如果在我的督促配置我不揭露模式生成,我應該是安全的...對? – user2635856