2016-08-19 14 views
1

Учитывая имя столбца таблицы ColumnNameIsVeryVeryLong.Псевдонимы имен столбцов, генерируемые Fluent NHibernate слишком длинны

FluentNhibernate генерирует SQL в качестве таковых ...

SELECT tablename0_.ColumnNameIsVeryVeryLong as ColumnNameIsVeryVeryLong2743_0_ 
FROM ...etc. 

Проблема заключается в том, что лежащий в основе базы данных Sybase поддерживает только идентификаторы до 30 байтов, так что генерируется псевдоним столбца ColumnNameIsVeryVeryLong2743_0_ генерирует следующее сообщение об ошибке.

Sybase.Data.AseClient.AseException : The identifier that starts with 'ColumnNameIsVeryVeryLong2743_0_' is too long. Maximum length is 30. 

Есть ли способ контролировать длину псевдонимов столбцов, которые сгенерированы? Изменение имени столбца не является вариантом.

+0

BTW, Fluentnhibernate не генерирует SQL. Регулярный старый NHibernate делает эту работу. – mxmissile

+0

Какой диалект вы используете? –

ответ

2

подклассы Диалект и переопределить длину макс:

public class DialectOverride: *BaseDialect* 
{ 
    public override int MaxAliasLength { get { return 30; } } 
} 

затем указать диалекте при настройке:

new DatabaseConfiguration().Dialect<DialictOverride>() 
+0

Обратите внимание, что SybaseASE15Dialect уже устанавливает MaxAliasLength = 30, а SybaseSQLAnywhere10Dialect (и 11 и 12) устанавливает его на 127. И SybaseASA9Dialect наследует MaxAliasLength = 10 из базового класса Dialect. –

1

Это на самом деле ошибка в NHibernate, где она не сможет правильно счета для MaxAliasLength: https://nhibernate.jira.com/browse/NH-3899

Обходной путь заключается в подпункте класса, который вы используете, чтобы переопределить свойство MaxAliasLength и позволить ему вернуть что-то в диапазоне 10-20, что оставит много места для уникального числового суффикса.