Свободный NHibernate и PostgreSQL, SchemaMetadataUpdater.QuoteTableAndColumns - System.NotSupportedException: указанный метод не поддерживается
Я использую 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 ответа
Попробуй это:
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();
}
- SchemaMetadataUpdater.QuoteTableAndColumns (nhibConfig);
- configuration.ExposeConfiguration (x => x.SetProperty ("hbm2ddl.keywords", "auto-quote"));
Я попробовал выше обоих. Он не работал для меня с последним Fluent NHibernate(5f7adcd) и последним postgresql 8.4. Эти двое, вероятно, отключены Fluent NHibernate. Если вы используете NHibernate и HBM без Fluent, это сработало бы для вас.
Чтобы явно попросить Fluent NHibernate сгенерировать Quoted Identifier для таблицы и столбца, я обезьяну пропатчил два файла в исходном коде Fluent NHibernate, чтобы заставить его работать для postgresql. (Если вам не нужна такая же сборка для других баз данных)
Пространство имен: FluentNHibernate.MappingModel.Output
Добавьте "Цитировать" к имени таблицы в XmlClassWriter.cs
if (classMapping.HasValue(x => x.TableName)) classElement.WithAtt("table", new System.Text.StringBuilder().Append("\"").Append(classMapping.TableName).Append("\"").ToString());
Добавьте "Цитировать" к имени столбца в 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 и создайте свой собственный с помощью вышеуказанных обновлений.
Создайте свое собственное соглашение об именах, переопределите соглашение об именах столбцов, чтобы включить цитату
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);
}
}