为什么代码优先/ EF在原始SQL命令中对字符串使用'nvarchar(4000)'?

时间:2011-06-30 17:31:27

标签: entity-framework ef-code-first

基本上我有一个带有邮政编码的表格。 zipcode字段定义为'char(5)'。我首先使用代码,所以我将这些属性放在ZipCode属性上:

[Key, Column( Order = 0, TypeName = "nchar"), StringLength(5)]
public string ZipCode { get; set; }

现在如果我在EF中查询这个:

var zc = db.ZipCodes.FirstOrDefault(zip => zip.ZipCode == "12345");

生成的SQL使用nvarchar(4000)来注入参数。咦?是因为“12345”在技术上是一个未知长度的字符串?在查询该表时,EF不应该足够聪明才能使用正确的“nchar(5)”吗?

我问,因为nvarchar(4000)查询需要半秒钟,而正确范围的查询要快得多(读取次数少)。

任何帮助/建议都将不胜感激。

2 个答案:

答案 0 :(得分:2)

这是为了利用自动参数化。以下文章解释了一般概念以及为何使用nvarchar(4000)。

http://msdn.microsoft.com/en-us/magazine/ee236412.aspx

答案 1 :(得分:1)

您是否尝试过使用MaxLength属性? This article给出了EF如何解释各种数据注释属性的合理摘要。