一尘不染

流利的NHibernate映射到SQL Server CHAR(10)ID列

sql

对于NHibernate和Fluent
NHibernate来说都是新手,我正在尝试解决由于将CHAR(10)列转换为导致的某些继承代码中的性能问题NVARCHAR

从SQL事件探查器:

exec sp_executesql N'select mytestclas0_.LinkId as LinkId45_, 
   mytestclas0_.Href as Href45_, 
   mytestclas0_.LinkActive as LinkActive45_ 
from MessageLinks mytestclas0_ 
where mytestclas0_.LinkId=@p0',N'@p0 nvarchar(4000)',@p0=N'BzE2T48HMF'

您可以看到来自NHibernate的ID被强制转换为NVARCHAR

表定义:

CREATE TABLE [dbo].[MyTable](
    [ID] [int] NULL,
    [Href] [nvarchar](1000) NULL,
    [LinkActive] [bit] NOT NULL,
    [LinkId] [char](10) NOT NULL
 )

类文件:

public class MyTestClass {
    public MyTestClass() {}

    public virtual string LinkId{ get; set; }
    public virtual string Href{ get; set; }
    public virtual bool LinkActive { get; set; }
}

映射文件:

  public class MyTestClassMapping : ClassMap<MyTestClass> {
    public MyTestClassMapping() {
      Table("MyTable");

      Id(x => x.LinkId).Length(10);
      Map(x => x.LinkId);
      Map(x => x.Href);
      Map(x => x.LinkActive);
    }
  }

我用LinkId和映射文件的数据类型尝试了许多不同的事情,包括以下映射:

    Id(x => x.LinkId).CustomSqlType("char(10)");
    Id(x => x.LinkId).Length(10).CustomSqlType("char");
    Id(x => x.LinkId).CustomSqlType("char");

我正在寻找一个指向示例或文档的指针,该示例或文档说明了如何将NHibernate传递的ID转换为CHAR(10)

在此先感谢您的帮助。


阅读 168

收藏
2021-05-30

共1个答案

一尘不染

映射应如下所示(请参见文档5.2.2。基本值类型):

Id(x => x.LinkId)      
  .CustomType("AnsiString")
  ...
  ;

char(非Unicode字符串)的NHibernate类型用于type="AnsiString"xml映射。以上是如何流利地做到这一点的方法。

在此处查看类似的故事:NHibernate性能(Ansi字符串与Unicode字符串)

旁注:我从未尝试指定长度…总是由NHibernate varchar(8000)使用MS SQL 2008方言生成的…

2021-05-30