2012-01-04 10 views
5

Ehi Sto cercando di memorizzare un semplice byte[] utilizzando EF 4 MySQL (il più recente connettore) e l'approccio code-first.Archiviare array di byte utilizzando Entity Framework 4, MySQL e prima il codice?

Semplicemente facendo:

public byte[] Thumbnail {get; set;} 

mi dà il seguente errore al momento della creazione:

Hai un errore nella sintassi SQL; controllare il manuale che corrisponde alla versione del server MySQL per la sintassi diritto di utilizzare vicino

E poi che punti a ciò che viene subito dopo il mio dichiarazione byte[].

Qualcuno ha qualche consiglio veloce per me?

+0

Mi sono perso qualcosa? Entity Framework non è compatibile solo con SQL Server? – Yuck

+0

@Yuck Entity framework non è solo compatibile con SQL Server, puoi vedere l'elenco qui: http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework#Entity_Framework_ADO.NET_providers –

+0

Ma per il codice prima è un elenco più snello –

risposta

2

È necessario utilizzare l'attributo MaxLength.

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

nota che le spire sopra in un tipo di dati TINYBLOB, wich can have indexing/primary key problems. Quando si utilizzano le migrazioni si trasforma in questo:

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

È possibile utilizzare l'attributo column e impostare TypeName-"Binary" se avete bisogno di indicizzazione/chiave primaria.

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

Sebbene quanto sopra risulta per me in una colonna binaria (1) (è come sono arrivato qui).

Modifica: Per avere una lunghezza corretta matrice binaria, è sufficiente aggiungere (16) dopo binary nel file di migrazione:

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

Purtroppo, aggiungendo che la la typename dell'attributo Colonna non funziona.

Modifica2: è possibile ottenere un database corretto senza la necessità di modificare il file di migrazione creando un MySqlMigrationSqlGenerator personalizzato.

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 ... 4 anni post. Uhm, non ho modo di convalidare questo è giusto, quindi ti crederò sulla parola – Dynde

Problemi correlati