Fluent NHibernate和PostgreSQL,SchemaMetadataUpdater.QuoteTableAndColumns - System.NotSupportedException:不支持指定的方法

时间:2010-03-13 13:26:38

标签: nhibernate postgresql fluent-nhibernate

我在PostgreSQL上使用fluentnhibernate。 Fluentnhibernate是最新版本。 PosrgreSQL版本是8.4。 我创建ISessionFactory的代码:

public static ISessionFactory CreateSessionFactory()
{
        string connectionString = ConfigurationManager.ConnectionStrings["PostgreConnectionString"].ConnectionString;
        IPersistenceConfigurer config = PostgreSQLConfiguration.PostgreSQL82.ConnectionString(connectionString);

        FluentConfiguration configuration = Fluently
            .Configure()
            .Database(config)
            .Mappings(m =>
                m.FluentMappings.Add(typeof(ResourceMap))                                    
                                .Add(typeof(TaskMap))
                                .Add(typeof(PluginMap)));
        var nhibConfig = configuration.BuildConfiguration();
        SchemaMetadataUpdater.QuoteTableAndColumns(nhibConfig);
        return configuration.BuildSessionFactory();
}

当我在SchemaMetadataUpdater.QuoteTableAndColumns(nhibConfig)行执行代码时; throw error:System.NotSupportedException:不支持指定的方法。请帮帮我!我非常需要解决方案。 最好的问候

3 个答案:

答案 0 :(得分:9)

试试这个:

public static ISessionFactory CreateSessionFactory()
{
        string connectionString = ConfigurationManager.ConnectionStrings["PostgreConnectionString"].ConnectionString;
        IPersistenceConfigurer config = PostgreSQLConfiguration.PostgreSQL82.ConnectionString(connectionString);

        FluentConfiguration configuration = Fluently
            .Configure()
            .Database(config)
            .Mappings(m =>
                m.FluentMappings.Add(typeof(ResourceMap))                                    
                                .Add(typeof(TaskMap))
                                .Add(typeof(PluginMap)));
        configuration.ExposeConfiguration(x => x.SetProperty("hbm2ddl.keywords", "auto-quote"));
        return configuration.BuildSessionFactory();
}

答案 1 :(得分:2)

  1. SchemaMetadataUpdater.QuoteTableAndColumns(nhibConfig);
  2. configuration.ExposeConfiguration(x => x.SetProperty(“hbm2ddl.keywords”,“auto-quote”));
  3. 我上面都试过了。最新的Fluent NHibernate(5f7adcd)和最新的postgresql 8.4对我来说无效。 Fluent NHibernate将这两者静音 可能 。如果你使用 NHibernate和HBM没有Fluent,它适合你。

    为了明确要求Fluent NHibernate为表和列生成引用标识符, 我在Fluent NHibernate源代码中修补了两个文件以强制它为postgresql工作。 (如果您不需要为其他数据库使用相同的构建)

    命名空间:FluentNHibernate.MappingModel.Output

    1. XmlClassWriter.cs

      中为表名添加“引用”
      if (classMapping.HasValue(x => x.TableName))
        classElement.WithAtt("table", new System.Text.StringBuilder().Append("\"").Append(classMapping.TableName).Append("\"").ToString());
      
    2. XmlColumnWriter.cs

      的列名称中添加“引用”
      if (columnMapping.HasValue(x => x.Name))
        element.WithAtt("name", new System.Text.StringBuilder().Append("\"").Append(columnMapping.Name).Append("\"").ToString());
      
    3. 到目前为止,这就像魅力一样。获取http://github.com/jagregory/fluent-nhibernate的来源 并通过以上更新建立自己的。

答案 2 :(得分:1)

创建自定义命名约定,覆盖列名约定以包含quote。

var fluentConfig = Fluently.Configure(new     Configuration().SetNamingStrategy(PostgreNamingStragegy.Instance))

internal class PostgreNamingStragegy: INamingStrategy
    {
    private static readonly INamingStrategy ImprovedNamingStrategy = NHibernate.Cfg.ImprovedNamingStrategy.Instance;

    private static PostgreNamingStragegy_postgreNamingStrategy;
    public static INamingStrategy Instance
    {
        get { return _postgreNamingStrategy?? (_postgreNamingStrategy= new PostgreNamingStragegy()); }
    }

    protected PostgreNamingStragegy()
    {
    }

    public string ClassToTableName(string className)
    {
        return ImprovedNamingStrategy.ClassToTableName(className);
    }

    public string ColumnName(string columnName)
    {
        return "\"" + columnName + "\"";
    }

    public string LogicalColumnName(string columnName, string propertyName)
    {
        return ImprovedNamingStrategy.LogicalColumnName(columnName, propertyName);
    }

    public string PropertyToColumnName(string propertyName)
    {
        return ImprovedNamingStrategy.PropertyToColumnName(propertyName);
    }

    public string PropertyToTableName(string className, string propertyName)
    {
        return ImprovedNamingStrategy.PropertyToTableName(className, propertyName);
    }

    public string TableName(string tableName)
    {
        return ImprovedNamingStrategy.TableName(tableName);
    }
}