image asp.net-mvc-3 sql-server-ce code-first entity-framework-4.1

Error al almacenar la imagen en SQL CE 4.0 con ASP.NET MVC 3 y Entity Framework 4.1 Code First



asp.net-mvc-3 sql-server-ce (3)

La forma de no especificar una 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 de SQL Compact luego asignará la propiedad a "imagen" y la validación de EF reconocerá que no hay una longitud máxima especificada y, por lo tanto, no es necesario deshabilitarla. Si desea ser explícito sobre la asignación a una columna de "imagen", puede hacer esto:

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

que producirá el mismo resultado cuando se usa SQL Compact.

Estoy intentando almacenar / guardar una imagen en una base de datos de SQL Compact Edition (CE).

Declaro el campo en mi modelo de 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 Foto como se puede ver aquí:

El problema es:

Cuando ejecuto la aplicación y trato de guardar un Estudiante con una foto de 3 MB (por ejemplo), obtengo 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 tipos de datos . En esta comparison entre SQL Express y SQL Compact Edition (CE), tenemos que SQL CE es compatible con el almacenamiento Binario (BLOB) mediante el uso del tipo de datos de imagen.

Imagen = Datos binarios de longitud variable 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 sale esta excepción:

Binary column with MaxLength greater than 8000 is not supported.

Editar:

Encontré el post sobre el lanzamiento de EF 4.1. Tiene lo siguiente:

Cambio de la longitud predeterminada para la cadena no clave y las columnas binarias de ''128'' a ''Max''. SQL Compact no admite las columnas "Máx.", Cuando se ejecuta contra SQL Compact, una convención adicional de Code First establecerá una longitud predeterminada de 4000. Hay más detalles sobre el cambio incluido en una publicación reciente del blog ( enlace a continuación ).

Bueno, bueno ... la única forma en que podría hacerlo funcionar fue haciendo lo que se describe here , es decir, configurando DbContext.Configuration.ValidateOnSaveEnabled = false . Esta es una solución como sugiere el post.


Para aquellos que experimentan este problema, Erik Ejlskov Jensen publicó una aplicación de consola de trabajo que demuestra la solución a este error. Como señaló el OP, una parte clave de la respuesta es:

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

Se ha encontrado una mejor solución. No deshabilite la validación. [Actualizaciones de la publicación del 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.


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

Podría agregar a la clase de contexto dentro del método OnModelCreating (DbModelBuilder modelBuilder)

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