2

NHibernate 構成にいくつかの任意のプロパティを設定する必要がある Fluent NHibernate プロジェクトがあります。私の最初の試みはこのようなもので、 から始めてFluently.Configure()、いくつかの流暢な構成を行い、 を呼び出しBuildConfiguration()、その構成にいくつかのプロパティを設定し、最後にISessionFactoryそれから を構築しました。

public static class NHibernateConfigurator
{
    private static readonly Configuration _configuration;
    private static readonly ISessionFactory _sessionFactory;

    static NHibernateConfigurator()
    {
        _configuration = Fluently.Configure()
            .Database(SQLiteConfiguration
                .Standard
                .InMemory()
                .Provider<TestConnectionProvider>()
                .FormatSql())
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<AcademicTermMapping>())
            .BuildConfiguration();

        _configuration
            .SetProperty(Environment.CollectionTypeFactoryClass, typeof(Net4CollectionTypeFactory).AssemblyQualifiedName)
            .SetProperty(Environment.CurrentSessionContextClass, "thread_static");

        var props = _configuration.Properties;
        if (props.ContainsKey(Environment.ConnectionStringName))
            props.Remove(Environment.ConnectionStringName);

        _sessionFactory = _configuration.BuildSessionFactory();

    }

最終的にはセッション ファクトリが動作する.SetPropertyようになりますが、途中の呼び出しは無視されるようです。(特に、Environment.CollectionTypeFactoryClass例外が発生するため、が無視されることはわかっています。残りの部分も無視されると想定しています。)

次の試行ではExposeConfiguration()、プロパティの設定に問題があります。

    static NHibernateConfigurator()
    {

        _configuration = Fluently.Configure()
            .Database(SQLiteConfiguration
                .Standard
                .InMemory()
                .Provider<TestConnectionProvider>()
                .FormatSql())
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<AcademicTermMapping>())
            .ExposeConfiguration(ConfigModifier)
            .BuildConfiguration();

        _sessionFactory = _configuration.BuildSessionFactory();

    }

    private static void ConfigModifier(Configuration config)
    {
        config.SetProperty(Environment.CollectionTypeFactoryClass, typeof(Net4CollectionTypeFactory).AssemblyQualifiedName);
        config.SetProperty(Environment.CurrentSessionContextClass, "thread_static");

        var props = config.Properties;
        if (props.ContainsKey(Environment.ConnectionStringName))
            props.Remove(Environment.ConnectionStringName);

    }

しかし、それもうまくいかないようです。幸いなことに、プロパティの 1 つに対応する流暢なメソッドがあるため、次のようにすることができます。

_configuration = Fluently.Configure()
    .CollectionTypeFactory<Net4CollectionTypeFactory>()
    // ... etc...

しかし、残りの部分に相当する流暢なものはありません。私はこれを間違っているに違いないと感じています。

アップデート

今、それは奇妙になっています。@Firo のアドバイスに従って、 の後に構成プロパティを確認しましたBuildConfiguration()。構成でプロパティを手動で設定するか.SetProperty、流暢を使用して構成で.CollectionTypeFactory<Net4CollectionTypeFactory>()同じプロパティを設定します。しかし、それらは別の順序で終了します。そこで、新しい構成でプロパティを手動で設定して、そこから続けてみました:

    static NHibernateConfigurator()
    {
        var baseConfig = new Configuration();
        baseConfig.SetProperty(Environment.CollectionTypeFactoryClass, typeof(Net4CollectionTypeFactory).AssemblyQualifiedName);

        _configuration = Fluently.Configure(baseConfig)
            .Database(SQLiteConfiguration
                .Standard
                .InMemory()
                .Provider<TestConnectionProvider>()
                .FormatSql())
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<AcademicTermMapping>())
            .ExposeConfiguration(ConfigModifier)
            .BuildConfiguration();

        _sessionFactory = _configuration.BuildSessionFactory();
    }

    private static void ConfigModifier(Configuration config)
    {
        config.SetProperty(Environment.CurrentSessionContextClass, "thread_static");

        var props = config.Properties;
        if (props.ContainsKey(Environment.ConnectionStringName))
            props.Remove(Environment.ConnectionStringName);
    }

そして、それは機能します。異なるメソッドは、順序が異なるだけで、すべて同じプロパティを生成します。上記はこれらを次のように生成し_configuration.Propertiesます:

[0] = {[use_reflection_optimizer, True]}
[1] = {[collectiontype.factory_class, DataAccess.NHibernate.Net4CollectionTypeFactory, DataAccess.NHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]}
[2] = {[connection.provider, DataAccess.NHibernate.Tests.TestConnectionProvider, DataAccess.NHibernate.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]}
[3] = {[connection.driver_class, NHibernate.Driver.SQLite20Driver, NHibernate, Version=3.3.1.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4]}
[4] = {[dialect, NHibernate.Dialect.SQLiteDialect, NHibernate, Version=3.3.1.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4]}
[5] = {[hibernate.dialect, NHibernate.Dialect.SQLiteDialect, NHibernate, Version=3.3.1.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4]}
[6] = {[query.substitutions, true=1;false=0]}
[7] = {[connection.release_mode, on_close]}
[8] = {[format_sql, true]}
[9] = {[connection.connection_string, Data Source=:memory:;Version=3;New=True;]}
[10] = {[current_session_context_class, thread_static]}

他のメソッドcollectiontype.factory_classは順番に移動しますが、順番は重要ではありません。

4

0 に答える 0