【问题标题】:NHibernate: Setting datatypes and lengths explicitly for query parametersNHibernate:为查询参数显式设置数据类型和长度
【发布时间】:2013-03-24 22:52:54
【问题描述】:

我正在使用 NHibernate 通过代码和 sql server 2012 映射。我还在会话工厂中使用 Sql2008ClientDriver 作为驱动程序。我一直在试图弄清楚如何将确切的 sql 类型和长度映射到表示表的 C# 对象。我遇到的问题是生成的 sql 中指定的数据类型,特别是字符串。

例如:

公共虚拟字符串 SomeProperty { get;放; }

生成查询时,这会转换为 nvarchar(4000) 参数,但此列是数据库中的 char(6)。是否可以在映射中指定一些方式?

我相信会有性能损失,因为 sql server 在执行查询之前会进行转换。

我已经尝试过了(但它不起作用):http://notherdev.blogspot.com.au/2012/01/mapping-by-code-property.html

有什么想法吗?

【问题讨论】:

    标签: c# nhibernate mapping-by-code


    【解决方案1】:

    这是一个能生成有效char(6) 字段的冗长映射。

    Property(x => x.SomeProperty,
             pm =>
             {
                 pm.Type(NHibernateUtil.AnsiString);
                 pm.Length(6);
                 pm.Column(cm => cm.SqlType("char(6)"));
             });
    

    对此的开箱即用支持可能会更好。

    【讨论】:

    • 嘿@Diego,由于某种原因,这被标记为低质量,我相信你知道添加一些解释:) 我只能给出建议
    • 嘿@Diego,我已经试过了,我现在得到了 varchar(8000)。我不确定这是否有帮助,但我使用 NHibernate 的 sql2008clientdriver 作为针对 2012 db 的驱动程序以及 mssql2012dialect。
    • @ChristianStewart 我想我可以添加一个标题。但由于这是一个“我该怎么做”类型的问题,所以我只是回答...
    • @pwee167 你从哪里得到 varchar(8000)?你的 NH 版本是什么?我刚刚运行它,我肯定创建了一个 char(6),虽然它在传递查询参数时使用了 8000(不是很重要)
    • @DiegoMijelshon 我正在使用 NH 3.3.1.4。我实际上是在谈论查询参数。这有什么不重要的原因吗?我已经通过 SSMS 使用正确的参数类型/长度运行了相同的查询,这似乎是一个显着的性能提升(20ms => 4ms)。
    【解决方案2】:

    在您的映射文件中,您可以指定sql-type

    <property name="SomeProperty" type="String">
       <column name="ColumnName" sql-type="char(6)" />
    </property>     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多