对于NHibernate和FluentNHibernate来说都是新手,我正在尝试解决由于将CHAR(10)列转换为导致的某些继承代码中的性能问题NVARCHAR。
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)。
在此先感谢您的帮助。
映射应如下所示(请参见文档5.2.2。基本值类型):
Id(x => x.LinkId) .CustomType("AnsiString") ... ;
char(非Unicode字符串)的NHibernate类型用于type="AnsiString"xml映射。以上是如何流利地做到这一点的方法。
char
type="AnsiString"
在此处查看类似的故事:NHibernate性能(Ansi字符串与Unicode字符串)
旁注:我从未尝试指定长度…总是由NHibernate varchar(8000)使用MS SQL 2008方言生成的…