由Fluent NHibernate生成的列名别名太长

本文关键字:别名 Fluent NHibernate | 更新日期: 2023-09-27 18:03:06

给定一个表的列名ColumnNameIsVeryVeryLong

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.

是否有任何方法来控制生成的列别名的长度?不能更改列名

由Fluent NHibernate生成的列名别名太长

继承Dialect并覆盖最大长度:

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

然后在配置时指定方言:

new DatabaseConfiguration().Dialect<DialictOverride>()

这实际上是NHibernate中的一个错误,它无法正确解释MaxAliasLength:https://nhibernate.jira.com/browse/NH-3899(修复于NHibernate 4.1)

解决方法是子类化您正在使用的方言来覆盖MaxAliasLength属性,并让它返回10-20范围内的东西,这将为唯一的数字后缀留下足够的空间。