【问题标题】:Fluent NHibernate and PostgreSQL, SchemaMetadataUpdater.QuoteTableAndColumns - System.NotSupportedException: Specified method is not supported流畅的 NHibernate 和 PostgreSQL,SchemaMetadataUpdater.QuoteTableAndColumns - System.NotSupportedException:不支持指定的方法
【发布时间】:2010-03-13 13:26:38
【问题描述】:

我在 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); 行执行代码时抛出错误:System.NotSupportedException:不支持指定的方法。请帮帮我!我非常需要解决方案。 最好的问候

【问题讨论】:

    标签: nhibernate postgresql fluent-nhibernate


    【解决方案1】:

    试试这个:

    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();
    }
    

    【讨论】:

    • Cool this (configuration.ExposeConfiguration...) 也适用于 MS SQL(以防万一)。
    【解决方案2】:
    1. SchemaMetadataUpdater.QuoteTableAndColumns(nhibConfig);
    2. configuration.ExposeConfiguration(x => x.SetProperty("hbm2ddl.keywords", "auto-quote"));

    我在上面都试过了。最新的 Fluent NHibernate(5f7adcd) 和最新的 postgresql 8.4 对我不起作用。这两个可能被 Fluent NHibernate 静音了。如果你使用 没有 Fluent 的 NHibernate 和 HBM,它对你有用。

    为了明确要求 Fluent NHibernate 为表和列生成 Quoted Identifier, 我在 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());
      

    到目前为止,这就像魅力一样。获取源代码http://github.com/jagregory/fluent-nhibernate 并通过上述更新构建您自己的。

    【讨论】:

    • PostgreSQL 将“引用”视为区分大小写,非引用标识符不区分大小写但全部折叠为小写,这意味着如果您不希望 Fluent NHibernate 为您生成区分大小写的“引用”查询,您可以将所有表和列重命名为小写名称,这会让您下次查看它们时感到奇怪。 :]
    【解决方案3】:

    创建您的自定义命名约定,覆盖列名称约定以包含引号。

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多