Цитирование имен столбцов с помощью NHibernate и PostgreSQL - PullRequest
9 голосов
/ 26 июля 2010

Я начал использовать NHibernate 3.0 и PostgreSQL для небольшого проекта, но пока что путь был немного тяжелым из-за неработоспособности сайта NHibernate, и я уверен, что этот ответ где-то есть на их сайте.

У меня есть база данных, в которой есть эти два столбца (конечно, в реальной таблице их больше):

int ID
String Feature

теперь я использую FluentNHibernate для сопоставления, поэтому что-то вроде этого:

public class MyEntityMap: ClassMap<MyEntity>
{
    public MyEntityMap()
    {
        Id(x => x.ID);
        Map(x => x.Feature);
    }
}

и запрос LINQ для получения данных

var strucs = from str in session.Query<MyEntity>()
             where str.ID < 5
             select str;

Запрос сгенерирует правильный оператор SQL, что-то вроде.Проблема в том, что в именах моих столбцов есть заглавные буквы, поэтому их нужно заключать в кавычки, но сгенерированный код SQL выглядит примерно так:

SELECT this_.ID as ID0_0_, this_.feature as feature0_0_, 
       FROM "MyEntity" this_ WHERE this_.ID < 5

Там, где столбцы не имеют кавычек вокруг них.Если я запускаю это, я получаю "column this_.id" не найден и т. Д.

Кто-нибудь знает, как я могу заставить NHibernate заключать имена столбцов в кавычки?

РЕДАКТИРОВАТЬ: Я не могу прописать имена столбцов в нижнем регистре, так как есть некоторые столбцы, в которых сторонней программе нужно, чтобы все были прописными.

Я попытался добавить .ExposeConfiguration (cfg => cfg.SetProperty ("hbm2ddl.keywords "," auto-quote "), но, похоже, ничего не делает.

Ответы [ 3 ]

4 голосов
/ 04 декабря 2012

Я понимаю, что это довольно старый вопрос, но для других, которые могут здесь оказаться, вы могли бы также реализовать собственную стратегию именования, при настройке фабрики сеансов вы добавили бы:

Fluently.Configure(new Configuration()
    .SetNamingStrategy(new CustomNamingStrategy()))...

В CustomNamingStrategy реализуйте интерфейс NHibernate.Cfg.INamingStrategy и для всех методов в основном просто возвращайте параметры с кавычками вокруг них.

3 голосов
/ 30 июля 2010

Поскольку hbm2ddl.keywords должен делать это для вас, а оно не работает, я бы посоветовал вам взять nhibernate source и отладить его с вашим проектом.

Вероятно, вы можете начать с точки останова в строке SessionFactoryImpl.cs 171

if (settings.IsAutoQuoteEnabled)

Взгляните на метод public static void QuoteTableAndColumns (Конфигурация конфигурации) в SchemaMetadataUpdater.cs

Надеюсь, это поможет.

2 голосов
/ 26 июля 2010

Не используйте заглавные буквы в именах таблиц / столбцов. Это решит эту проблему и сделает специальные запросы менее болезненными, так как вам не придется их цитировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...