NHibernate使用错误的列类型进行LINQ包含查询(varchar to nvarchar)

Stu*_*est 9 c# linq sql-server nhibernate linq-to-nhibernate

我遇到了NHibernate 3.3.3针对SQL Server的问题,使用NVARCHAR作为参数来反对从LINQ表达式中的函数创建VARCHARLIKE查询的列string.Contains().我有Fluent映射告诉NHibernate该列是VARCHAR,并且基本的"=="比较确实使用了一个VARCHAR参数.

可能的答案在Lambda字符串中列为VARCHAR,但经过多次输入(无法复制/粘贴到我的开发环境中)后,我无法获得任何答案.

这是一个存储VARCHAR列的表:

CREATE TABLE Names (
   Id   INT         NOT NULL IDENTITY (1, 1) PRIMARY KEY,
   Name VARCHAR(20) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

以下是一些代码snipets来说明正在发生的事情:

public class Names
{
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
}

public class NamesMap : ClassMap<Names>
{
   Table("Names");
   Id(x => x.Id).Column("Id").GeneratedBy.Identity();
   Map(x => x.Name).Column("Name").CustomType("AnsiString");
}

// _namesRepository is an IQueryable to the name collection
var matchName = "fred";
var name1 = _namesRepository.Where(o => o.Name == matchName).FirstOrDefault();
var name2 = _namesRepository.Where(o => o.Name.Contains(matchName)).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

获取name1的调用将生成一个参数:

DECLARE @p0 varchar(8000) = 'fred';
Run Code Online (Sandbox Code Playgroud)

获取name2的调用将生成一个参数:

DECLARE @p0 nvarchar(8000) = N'fred';
Run Code Online (Sandbox Code Playgroud)

有没有人想出一个有效的解决方案来使LINQ字符串函数调用将参数映射到正确的类型?

编辑:已确认NHibernate 4.0.0.GA版本中仍存在此相同的行为.

Yog*_*gee 1

我还没有准备好项目,所以无法验证,但请检查您是否可以指定

Map(x => x.Name).Column("Name").SqlType("varchar(20)");如果它有效的话