实体框架6.0 NVarchar vs Varchar



我有一个在Azure上运行的网站,这让我很头疼。我认为在Azure中,select查询是一个昂贵的查询,它来自EF。

查询是针对数据库中的varchar列的选择,但是从EF中,它将其转换为nvarchar(4000),导致查询超时。

下面是我在代码中调用查询的方式:

var myObject = db.MyTable.FirstOrDefault(cm => cm.MyField == entryModel.MyField.Trim());

我已经搜索了许多解释EF如何使用nvarchar而不是varchar的资源,因此我尝试将此注释添加到我的模型类中的字段:

[Column(TypeName = "varchar(50)")]

当这不起作用时,我尝试将此添加到OnModelCreating方法:

modelBuilder.Entity<MyTable>().Property(x => x.MyField).IsUnicode(false);

我也试过强制所有字符串为varchar:

modelBuilder.Properies<string>().Configure(x => x.HasColumnType("varchar(1000)"));

查询仍然会导致性能问题,根据数据库中的活动监视器,查询仍然显示如下:

(@p__linq__0 nvarchar(4000))SELECT TOP (1) 
blah blah fields
FROM [dbo].[MyTable] AS [Extent1]
WHERE ([Extent1].[MyField] = (LTRIM(RTRIM(@p__linq__0)))) OR (([Extent1].[MyField] IS NULL) AND (LTRIM(RTRIM(@p__linq__0)) IS NULL))

你知道是什么原因造成的吗?我现在正准备编写一个存储过程来调用,而不是使用这个EF查询。

编辑感谢@Robert Harvey和@StriplingWarrior的帮助删除内联trim允许EF识别varchar更改,并从实际的SQL调用中删除trim。

var myField = entryModel.MyField.Trim();
var myObject = db.MyTable.FirstOrDefault(cm => cm.MyField == myField);                                    

谢谢!

亚伦

如果使用注释,请考虑分别指定Column和MaxLength。

[Required]
[Column(TypeName = "varchar")]
[MasLength(20)]
string MyString { get; set; }

相关内容

  • 没有找到相关文章

最新更新