FluentNhibernate и сохранение заглавной буквы имени таблицы / столбца и экранирование? - PullRequest
2 голосов
/ 17 марта 2012

Вопрос относительно свободного отображения таблицы nHibernate:

Очевидно, у меня сложилось ошибочное впечатление, что с помощью инструмента ORM, такого как nHibernate, можно получить независимость от базы данных - по крайней мере, при создании таблицы.

Теперь у меня есть автоматизированный инструмент (http://nmg.codeplex.com), который создает для меня беглые отображения nHibernate. Это также работает нормально (хотя только если все таблицы имеют первичный ключ ...)

Вот хороший репрезентативный пример для такого отображения, как оно создается программой

public class ELMAH_ErrorMap : ClassMap<ELMAH_Error> 
{

    public ELMAH_ErrorMap() 
    {
        Table("ELMAH_Error");
        LazyLoad();
        Id(x => x.ErrorId).GeneratedBy.Assigned().Column("ErrorId");
        Map(x => x.Application).Column("Application").Not.Nullable().Length(60);
        Map(x => x.Host).Column("Host").Not.Nullable().Length(50);
        Map(x => x.Type).Column("Type").Not.Nullable().Length(100);
        Map(x => x.Source).Column("Source").Not.Nullable().Length(60);
        Map(x => x.Message).Column("Message").Not.Nullable().Length(500);
        Map(x => x.User).Column("User").Not.Nullable().Length(50);
        Map(x => x.StatusCode).Column("StatusCode").Not.Nullable();
        Map(x => x.TimeUtc).Column("TimeUtc").Not.Nullable();
        Map(x => x.Sequence).Column("Sequence").Not.Nullable();
        Map(x => x.AllXml).Column("AllXml").Not.Nullable().Length(1073741823);
    }
}

Очевидно, проблема # 1 была в этой строке

Map(x => x.User).Column("User").Not.Nullable().Length(50);

Потому что пользователь является защищенным ключевым словом в MS-SQL (и postgre также). Поэтому экспорт схемы завершился неудачно с синтаксической ошибкой рядом с «Пользователь».

Теперь, очевидно, это можно решить, заключив имя столбца (или таблицы) в соответствующие escape-символы ([] для MS-SQL, "" для PostGreSQL)

Итак, я изменился

Map(x => x.User).Column("User").Not.Nullable().Length(50);

до

Map(x => x.User).Column("[User]").Not.Nullable().Length(50);

и все работало нормально.

Тогда на PostGre мне пришлось поменять

Map(x => x.User).Column("[User]").Not.Nullable().Length(50);

до

Map(x => x.User).Column("\"User\"").Not.Nullable().Length(50);

потому что postgre использует эту другую escape-последовательность ...

Итак, теперь я должен создать отдельное отображение для каждой системы БД? (MySQL имеет еще один escape-символ ..., интересно, что использует FireBird) ARGH?!?

И еще одна проблема, которая существует: Для каждой таблицы и столбца, которые не заключены в кавычки, PostGre изменяет имя таблицы / столбца на строчные, что является «хорошим» (но только потому, что оно не чувствительно к регистру), но если имя закодировано в кавычках становится чувствительным к регистру ...

Тогда у меня есть около 200 видов на порт ... На самом деле я не хочу писать синтаксический анализатор только для того, чтобы заключать каждый столбец каждого представления (а также имена таблиц и представлений) в любые кавычки, используемые в любой базе данных ...

Есть ли способ сказать fluent / nHibernate, чтобы я избегал имен таблиц и столбцов для меня (либо всегда, но предпочтительно только при необходимости)?

Самое смешное, что моя собственная БД на самом деле не является проблемой (я ставлю все свои 200 таблиц с префиксом T_ и каждый столбец с некоторым идентификатором таблицы), проблема в том, что все эти дурацкие сторонние компоненты (такие как ELMAH или Session) / Провайдеры членства и т. Д.), Написанные людьми, которые ... [самоцензура]

1 Ответ

2 голосов
/ 17 марта 2012

Возможно, вы не установили свойство hbm2ddl.keywords (должно быть включено по умолчанию).

Попробуйте посмотреть этот пост от Фабио Мауло.

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