18

Estoy tratando de almacenar/guardar una imagen en una base de datos SQL Compact Edition (CE).Error al almacenar la imagen en SQL CE 4.0 con ASP.NET MVC 3 y Entity Framework 4.1 Código Primero

declaro el campo en mi modelo del estudiante como:

[Column(TypeName = "image")] 
public byte[] Photo { get; set; } 

La base de datos se crea con el tipo de datos de imagen para la columna de fotos como se puede ver aquí:

enter image description here

El el problema es:

Cuando ejecuto la aplicación y trato de guardar un Estudiante con una Foto de 3 MB (por ejemplo), recibo una excepción:

validationError.ErrorMessage = "The field Photo must be a string or array type 
with a maximum length of '4000'." 

SQL Server CE admite estos Data Types. En este comparison entre SQL Express y SQL Compact Edition (CE), tenemos que SQL CE admite el almacenamiento Binario (BLOB) mediante el uso del tipo de datos de imagen.

Image = de longitud variable de datos binarios con una longitud máxima de 2^30-1 (1,073,741,823) bytes. El almacenamiento es la longitud del valor en bytes.

La imagen debería hacer el trabajo, creo.

¿Qué estoy haciendo mal aquí? ¿Es esto un error?

Nota:

También probé la anotación de datos MaxLength:

[Column(TypeName = "image")] 
[MaxLength(int.MaxValue)] 
public byte[] Photo { get; set; } 

pero me da esta excepción:

Binary column with MaxLength greater than 8000 is not supported. 

Editar:

he encontrado el post sobre el lanzamiento de EF 4.1. Tiene la siguiente:

Cambio de longitud predeterminada de los que no son clave cuerda y columnas binarias de ‘128’ a ‘Max’. SQL Compact no admite columnas 'Max', cuando se ejecuta contra SQL compacto una convención adicional Código Primera establecerá una longitud predeterminada de 4000. Hay más detalles acerca el cambio incluida en un reciente post (enlace debajo de).

Bueno, bueno ... la única manera de que pudiera conseguir que funcione estaba haciendo lo que se describe here, es decir, el establecimiento de DbContext.Configuration.ValidateOnSaveEnabled = false. Esta es una solución, como sugiere la publicación.

+0

lo grande que es su imagen? –

+0

@Alexandre: son 3 MB. –

Respuesta

18

Para aquellos que experimentan este problema, Erik Ejlskov Jensen publicó a working console application que demuestra la solución a este error. Tal como señaló el OP, una parte clave de la respuesta es:

public StudentContext() 
    { 
     // Required to prevent bug - http://stackoverflow.com/questions/5737733 
     this.Configuration.ValidateOnSaveEnabled = false;   
    } 

Se ha encontrado una mejor solución. No deshabilite la validación [Actualizaciones de entrada en el blog] UPDATE: @DamienGuard, of LINQ to SQL and EF Code First fame, pointed out that a better and more provider agnostic solution is to use MaxLength rather than TypeName = “ntext”.

UPDATE 2: Using [MaxLength] prevents any validation errors, and disabling validation is not required.

+1

Gracias por informarme sobre su publicación en el blog. Me puse en contacto con Erik cuando me enfrenté a este error para poder investigar más a fondo. Es bueno ver una publicación de blog dedicada a esta pregunta. Como mi pregunta también menciona, la única forma de resolver este problema es establecer 'ValidateOnSaveEnabled = false'. –

+0

Aconsejaría en contra de deshabilitar la validación. La respuesta que menciona establecer MaxLength es una respuesta mucho mejor. –

+1

En realidad, la respuesta correcta es usar el atributo [MaxLength], he actualizado la publicación de mi blog en consecuencia – ErikEJ

12

La forma de especificar ninguna longitud máxima utilizando la anotación de datos MaxLength es proporcionar ningún valor máximo. Por ejemplo:

[MaxLength] 
public byte[] Photo { get; set; } 

El proveedor compacto SQL a continuación, asignar la propiedad de "imagen" y validación EF se reconoce que no hay una longitud máxima especificada y por lo tanto no necesita estar deshabilitado. Si quieres ser explícito acerca de la asignación a una columna de "imagen", entonces usted puede hacer esto:

[Column(TypeName = "image")] 
[MaxLength] 
public byte[] Photo { get; set; } 

que producirá el mismo resultado cuando se utiliza SQL compacto.

+2

justo lo que necesitaba, también [MaxLength] aplicado a cadenas crea columnas ntext (de longitud ilimitada) en SQL Server CE –

+0

Obtengo una excepción de "Valores predeterminados no admitidos", si solo usa [MaxLength]. Y si uso [MaxLength (n)] n no puede ser mayor que 8000? – smerlung

2

Sé que esto es demasiado tarde, pero podría beneficiar a otros programadores.

Se podría añadir a la clase dentro del contexto OnModelCreating (DbModelBuilder modelBuilder) método

modelBuilder.Entity<EntityName>().Property(p => p.Photo).IsMaxLength(); 
Cuestiones relacionadas