Свободный NHibernate и PostgreSQL, SchemaMetadataUpdater.QuoteTableAndColumns - System.NotSupportedException: указанный метод не поддерживается - PullRequest
10 голосов
/ 13 марта 2010

Я использую fluentnhibernate с PostgreSQL. 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: указанный метод не поддерживается. Помоги мне, пожалуйста! Мне очень нужно решение. С наилучшими пожеланиями

Ответы [ 3 ]

9 голосов
/ 14 марта 2010

Попробуйте это:

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();
}
2 голосов
/ 20 апреля 2010
  1. SchemaMetadataUpdater.QuoteTableAndColumns (nhibConfig);
  2. configuration.ExposeConfiguration (x => x.SetProperty ("hbm2ddl.keywords", "auto-quote"));

Я пытался выше обоих. Это не сработало для меня с последним Fluent NHibernate (5f7adcd) и последним postgresql 8.4. Эти два вероятно на немой по Fluent NHibernate. Если вы используете NHibernate и HBM без свободно, это сработало бы для вас.

Чтобы явно попросить 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());
    

Пока это работает как шарм. Получить источник на http://github.com/jagregory/fluent-nhibernate и создайте свой собственный с вышеуказанными обновлениями.

1 голос
/ 07 ноября 2015

Создайте пользовательское соглашение об именах, переопределите соглашение об именах столбцов, чтобы включить кавычки.

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...