我们正在使用Entity Framework 6.1.1,代码优先和DbContext。
这是一个简单的查询:
Properties.Where(p => p.PropertyID == "aPRoperty")
生成并执行的SQL查询是:
WHERE N'aPRoperty' = [Extent1].[PropertyID]
但是,数据库中的propertyID是varchar(10)。所以上面的谓词执行索引扫描而不是索引搜索。这是由于谓词中的数据类型不同。
我可以使用以下方法强制执行正确的查询:
Properties.Where(p => p.PropertyID == DbFunctions.AsNonUnicode("aPRoperty"))
这将生成不带N unicode说明符的参数,我们得到一个Index Seek。
这是一个错误吗?这些字段在代码优先映射中映射了IsUnicode(false)。
是否有一种全局方式来配置它,而不必在我们对数据库中的char或varchar字段执行的每个查询中使用Dbfunction?
答案 0 :(得分:0)
您可以在OnModelCreating事件中将所有字符串全局映射到varchar。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties<string>().Configure(c => c.IsUnicode(false));
}
答案 1 :(得分:0)
对不起所有的误报。在重建我的模型dll并将其重新加载到linqpad后,它似乎正常工作。
我向EF团队致歉,诅咒你的名字几分钟。