【问题标题】:Column name aliases generated by Fluent NHibernate too longFluent NHibernate 生成的列名别名太长
【发布时间】:2016-12-27 00:01:47
【问题描述】:

给定一个表列名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.

有没有办法控制生成的列别名的长度?更改列名不是一种选择。

【问题讨论】:

  • 顺便说一句,Fluentnhibernate 不会生成 SQL。普通的旧 NHibernate 会做这项工作。
  • 你用的是哪种方言?

标签: c# nhibernate fluent-nhibernate sybase


【解决方案1】:

子类化方言并覆盖最大长度:

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

然后在配置的时候指定方言:

new DatabaseConfiguration().Dialect<DialictOverride>()

【讨论】:

  • 请注意,SybaseASE15Dialect 已设置 MaxAliasLength=30,而 SybaseSQLAnywhere10Dialect(以及 11 和 12)将其设置为 127。SybaseASA9Dialect 从 Dialect 基类继承 MaxAliasLength=10。
【解决方案2】:

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

解决方法是对您使用的方言进行子类化以覆盖 MaxAliasLength 属性,并让它返回 10-20 范围内的内容,这将为唯一的数字后缀留出足够的空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 2012-01-07
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多