2014-06-30 41 views
8

Sto cercando di usare il codice EF6 primo + MySQL con le migrazioni, ma mi sono bloccato con questo errore durante add-migration:EF6 codefirst + MySql migrazioni: tipo nvarchar (max) non supportato

The underlying provider does not support the type 'nvarchar(max)' 

E 'quindi sembra che EF stia cercando di usare i tipi di SQLServer per MySql, anche se ho cambiato la factory di connessione predefinita nella mia configurazione.

È possibile trovare molti problemi con lo stesso messaggio di errore, ma nessuno di essi sembra aggiornato o suggerire qualcosa che non ho già provato. Ecco i miei passi per abilitare le migrazioni in una DLL DAL per MySql, qualcuno potrebbe dare un suggerimento?

(1) Aggiungere il NuGet pacchetti:

  • MySql.ConnectorNET.Data
  • MySql.ConnectorNET.Entity

(2) Aggiungere una stringa di connessione per MySql nel file App.config, come:

(connectionStrings) 
(add name="MySqlConn" 
    connectionString="Data Source=127.0.0.1;Port=3306;Database=dummy;User id=***;Password=***;charset=utf8" 
    providerName="MySql.Data.MySqlClient" /) 
(/connectionStrings) 

(3) Inoltre, assicurarsi che la configurazione (nel mio caso App.config) è stato modificato da NuGet come specificato:

  • sostituire la produzione connessioni predefinita:

    (tipo defaultconnectionfactory =" MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" /)

  • aggiungere il provider di MySql:

    (invariantname fornitore = "MySql.Data.MySqlClient" Type = "MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version = 6.8.3.0, Culture = neutral, PublicKeyToken = c5687fc88969c44d" /)

  • fornitore metti in System.Data:

    (system.data) (DbProviderFactories) (rimuovere name = "MySQL Provider" invariante = "MySql.Data.MySqlClient" /) (add name =" MySQL Data Provider " invariant =" MySql.Data.MySqlClient " description =". Net Framework Data Provider per MySQL " type =" MySql.Data.MySql Client.MySqlClientFactory, MySql.Data, Version = 6.8.3.0, Culture = neutral, PublicKeyToken = c5687fc88969c44d"/) (/ DbProviderFactories) (/system.data)

(4) aggiungere manualmente il tipo di configurazione codice attributo (preferisco non toccare il mio codice contesto dati, in quanto deve essere mantenuto generico), come raccomandato in http://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html:

(entityframework codeconfigurationtype="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6") 

Un paio di proprietà di stringa nei miei oggetti POCO hanno nessun limite di durata come devono essere nvarchar(max) ie text in MySql.Tuttavia, ottengo l'errore citato sopra, con questo stacktrace:

System.ArgumentException: The underlying provider does not support the type 'nvarchar(max)'. 
    at MySql.Data.MySqlClient.MySqlProviderManifest.GetEdmType(TypeUsage storeType) 
    at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.BuildColumnModel(EdmProperty property, ModelMetadata modelMetadata, IDictionary`2 annotations) 
    at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.BuildAlterColumnOperation(String table, EdmProperty targetProperty, ModelMetadata targetModelMetadata, EdmProperty sourceProperty, ModelMetadata sourceModelMetadata) 
    at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.(FindAlteredColumns)b__24b(()f__AnonymousType2c`2()h__TransparentIdentifier243) 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(ModelMetadata source, ModelMetadata target, Lazy`1 modificationCommandTreeGenerator, MigrationSqlGenerator migrationSqlGenerator, String sourceModelVersion, String targetModelVersion) 
    at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(XDocument sourceModel, XDocument targetModel, Lazy`1 modificationCommandTreeGenerator, MigrationSqlGenerator migrationSqlGenerator, String sourceModelVersion, String targetModelVersion) 
    at System.Data.Entity.Migrations.DbMigrator.Scaffold(String migrationName, String namespace, Boolean ignoreChanges) 
    at System.Data.Entity.Migrations.Design.MigrationScaffolder.Scaffold(String migrationName, Boolean ignoreChanges) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Scaffold(MigrationScaffolder scaffolder) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Run() 
    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.Scaffold(String migrationName, String language, String rootNamespace, Boolean ignoreChanges) 
    at System.Data.Entity.Migrations.AddMigrationCommand.Execute(String name, Boolean force, Boolean ignoreChanges) 
    at System.Data.Entity.Migrations.AddMigrationCommand.()c__DisplayClass2.(.ctor)b__0() 
    at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command) 
The underlying provider does not support the type 'nvarchar(max)'. 

Qualsiasi suggerimento?

+0

6 mesi più tardi e ho * esattamente * lo stesso problema. Avrei potuto scrivere questa domanda fino all'ultimo dettaglio. Sei mai arrivato per caso a qualche risposta con questo? – Adam

+0

Purtroppo non l'ho fatto. Dovrei trovare una soluzione (oltre a impostare esplicitamente i tipi tramite attributi o sintassi fluente) la pubblicherò qui. Almeno io non sono solo :) – Naftis

+0

Ho trovato qualcosa di interessante. Ho provato a convertire un progetto dall'utilizzo di mssql, quindi ho già avuto alcune migrazioni. Normalmente con il nostro errore non puoi nemmeno eseguire add-migration. Tuttavia, dato che avevo già installato i file di migrazione, potevo eseguire update-database ... che eseguiva l'RAN di tutte le migrazioni, ma dopo aver aggiunto tutte le modifiche allo schema, è saltato fuori con questo errore ... I ' m indovinando si verifica quando il Contesto viene avviato per la prima volta prima della semina. Pazzesco che sono riuscito a rotolare in avanti (AND indietro) tramite update-database. – Adam

risposta

0

I passi seguenti hanno provocato lo stesso messaggio di errore per me:

  1. Creare un progetto utilizzando Entity Framework e SQL Server, con una migrazione. Utilizzare alcune proprietà string senza MaxLength nelle classi del modello, che sono mappate su nvarchar(max).
  2. Riconfigura per MySQL come sopra, per un database MySQL vuoto.
  3. Corsa Update-Database.

Utilizzo di tutte le ultime versioni di librerie software al momento della scrittura.

Dopo aver ricevuto l'errore, ho provato a impostare [MaxLength(..)] su tutte le proprietà di stringa. Il messaggio di errore continuava a venire, anche a ricreazione della migrazione con Add-Migration Initial -Force.

Nel mio caso si è scoperto che la chiamata a Update-Database sul mio database MySQL (che si è svolta il vecchio migrazioni significava per SQL Server compreso nvarchar(max)) aveva provocato alcuni effetti sulla mia base di dati, vale a dire le tabelle essere creato, ma non tutti.

La soluzione per me è stato:

  1. rilasciare questi tavoli, assicurarsi che il database era di nuovo vuota.
  2. Enable-Migrations -Force
  3. Add-Migration Initial -Force
  4. Update-Database

Si noti che questi passaggi sovrascrivono qualsiasi modifica manuale ai vostri migrazioni e Seed() funzione, si potrebbe desiderare di ripristinare quelli selettivamente.

Dopo questo ho provato le proprietà di stringa senza [MaxLength(..)]. Questi possono essere usati bene con il provider MySQL, sono mappati a longtext.

2

Ho lottato con lo stesso errore per tutta la notte. La correzione era contro-intuitiva ma finora così buona ... Sembra che il problema avesse a che fare con le vecchie migrazioni impostate con LocalDB (SQL Server), ma anche l'eliminazione delle vecchie migrazioni non aveva alcun effetto. Ho anche passato un sacco di tempo inutile a giocherellare con il mio Web.config, database Context, ecc ... Suggerisco di provare quanto segue prima di sbattere la testa sul muro ...

  1. eliminare la cartella migrazioni
  2. Prova ad abilitare le migrazioni e aggiungendo la migrazione iniziale (nel tipo PM "Enable-migrazioni" e poi "add-migrazione init")
  3. Se si ottiene l'errore precedente in il PM, cancellare di nuovo la cartella di migrazioni, quindi aprire MySQL Workbench
  4. All'interno MySQL Workbench, individuare lo schema con il nome assegnato nella tua connectionString (sarà simile database = whateverYouCalledIt)
  5. in tale schema, aperto il tavoli e trovare "__migrationhistory"
  6. clic destro quel tavolo, fare clic su Seleziona le righe, ed eliminare le voci di migrazione esistenti, quindi ripetere il passaggio 2

Per qualche motivo questo ha fatto il trucco per me quando si eliminano le migrazioni nella soluzione l'esploratore non ha avuto alcun effetto. A quanto pare, questo non cancella la storia di migrazione nel database ...

0

Ho avuto lo stesso problema e ha trovato la causa principale è stata migrazioni che si presentava così esistente: AddColumn("dbo.RoundJumperMap", "VideoUrl", c => c.String());

Una volta ho trovato tutte le persone e ha aggiunto una lunghezza massima, tutto è andato alla grande. AddColumn("dbo.RoundJumperMap", "VideoUrl", c => c.String(maxLength: 1000));

Non ho bisogno di eliminare nessuna delle mie migrazioni esistenti o qualcosa del genere.

Problemi correlati