2011-06-30 9 views
6

Básicamente tengo una tabla con códigos postales. El campo de código postal se define como 'char (5)'. Estoy utilizando el código en primer lugar, por lo que he puesto estos atributos en mi propiedad Código postal:¿Por qué el código first/EF usa 'nvarchar (4000)' para cadenas en el comando SQL sin formato?

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

Ahora bien, si me pregunta contra esto en EF:

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

El SQL generado utiliza nvarchar (4000) para inyectar los parámetros. ¿Huh? ¿Es porque "12345" es técnicamente una cadena de longitud desconocida? ¿No debería EF ser lo suficientemente inteligente como para usar el "nchar (5)" apropiado al consultar esa tabla?

Lo pido porque la consulta nvarchar (4000) lleva medio segundo, mientras que la consulta del alcance correcto es mucho más rápida (y menos lecturas).

Cualquier asistencia/consejo sería apreciado.

+0

cayo y volver a crear la base de datos después de agregar los atributos de sus entidades? – BrokenGlass

+0

Esto va en contra de una base de datos existente y no permitiré que Code First la vuelva a generar. La base de datos existente definitivamente es char (5). –

Respuesta

2

Esto es para aprovechar la parametrización automática. El siguiente artículo explica el concepto general y también por qué se usa específicamente nvarchar (4000).

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

+1

Hrm, gracias por la respuesta. Pero supongo que todavía no responde por qué EF funciona de esta manera. ¿No sería más eficiente usar los mismos tipos de datos al generar consultas? –

+0

"Otro buen hábito para los tipos de datos basados ​​en cadenas es especificar siempre la longitud del parámetro. Este valor debe ser la longitud del campo en el predicado SQL que usa el parámetro o la longitud máxima de la cadena (4,000 para NVARCHAR, 8,000 para VARCHAR), no la longitud de la cadena en sí misma. La auto parametrización de SQL Server siempre asume la longitud máxima de cadena ... "- me parece que esto informa por qué tomarían la decisión. ¿Estoy malentendido? –

+1

Supongo que está bien que el artículo lo diga, pero el rendimiento es definitivamente diferente entre las dos consultas. Es muy extraño que el equipo de EF elija ir por una ruta menos eficiente. Oh, bueno, aceptaré tu respuesta. –

1

¿Ha intentado utilizar el atributo MaxLength? This article da un resumen decente de cómo los atributos de anotación de datos diferentes son interpretados por EF.

+0

Voy a intentar usar MaxLength, gracias. También estaba usando StringLength y tenía la misma pregunta que el autor de esta pregunta. Gracias. – Naomi

+0

MaxLength no funcionó para mí, ¿puede ser porque estoy configurando atributos usando MetaDataClass? 'code' clase parcial público OperatorMetadata { [columna (TypeName = "char")] [StringLength (6)] [MaxLength (6)] código de operación public String {get; conjunto; } – Naomi

Cuestiones relacionadas