2012-01-04 19 views
5

Hola, estoy tratando de almacenar un simple byte[] utilizando EF 4 MySQL (el conector más nuevo) y el enfoque de primer código.¿Almacenar una matriz de bytes utilizando Entity Framework 4, MySQL y el código primero?

Simplemente haciendo:

public byte[] Thumbnail {get; set;} 

me da el siguiente error en la creación:

Usted tiene un error en su sintaxis SQL; consulte el manual que corresponde a su versión del servidor MySQL para el sintaxis derecho al uso cerca de

Y entonces se apunta a lo que viene justo después de mi declaración byte[].

¿Alguien tiene algún consejo rápido para mí?

+0

¿Echo de menos algo? ¿No es Entity Framework solo compatible con SQL Server? – Yuck

+0

@Yuck Entity Framework no solo es compatible con SQL Server, puede ver la lista aquí: http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework#Entity_Framework_ADO.NET_providers –

+0

Pero para el código primero es una lista más simple –

Respuesta

2

Debe utilizar el atributo MaxLength.

[MaxLength(16)] 
public byte[] test { get; set; } 

Tenga en cuenta que lo anterior lo convierte en un tipo de datos TINYBLOB, wich can have indexing/primary key problems. Al utilizar las migraciones se convierte en esto:

AddColumn("dbo.testDB", "test", c => c.Binary(storeType: "tinyblob")); 

Usted puede utilizar el atributo column y establecer TypeName-"Binary" si necesita indexación/clave principal.

[MaxLength(16), Column(TypeName = "Binary")] 
public byte[] test { get; set; } 

Aunque lo anterior da como resultado una columna Binaria (1) para mí (así es como llegué aquí).

Editar: Para obtener una matriz binaria de longitud correcta, basta con añadir (16) después binary en el archivo de migración:

AddColumn("dbo.testDB", "test", c => c.Binary(storeType: "binary(16)")); 

Desafortunadamente, añadiendo que la typename del atributo de columna no funciona.

Edit2: Es posible obtener una base de datos correcta sin necesidad de editar el archivo de migración creando un MySqlMigrationSqlGenerator personalizado.

internal class CustomMySqlMigrationSqlGenerator : MySqlMigrationSqlGenerator 
{ 
    protected override MigrationStatement Generate(CreateTableOperation op) 
    { 
     MigrationStatement statement = base.Generate(op); 

     foreach (ColumnModel column in op.Columns) 
     { 
      if (column.MaxLength.HasValue) 
      { 
       statement.Sql = statement.Sql.Replace($"`{column.Name}` binary", $"`{column.Name}` binary({column.MaxLength.Value})"); 
      } 
     } 

     return statement; 
    } 
} 
+0

Wow ... publicación de 4 años. Uhm, no tengo forma de confirmar que esto sea correcto, así que solo tomaré tu palabra. – Dynde

Cuestiones relacionadas