2010-07-19 13 views
29

Ho pensato di sperimentare un po 'con lo latest post di Scott Guthrie sullo sviluppatore di codice con Entity Framework 4. Invece di utilizzare SQL Server, sto cercando di utilizzare MySql. Qui ci sono le parti rilevanti del mio web.config (questo è un 2 applicazione Asp.Net MVC):Utilizzo di MySql con Entity Framework 4 e CTP

<connectionStrings> 
    <add name="NerdDinners" 
     connectionString="Server=localhost; Database=NerdDinners; Uid=root; Pwd=;" 
     providerName="MySql.Data.MySqlClient"/> 
    </connectionStrings> 
    <system.data> 
    <DbProviderFactories> 
     <add name="MySQL Data Provider" 
      invariant="MySql.Data.MySqlClient" 
      description=".Net Framework Data Provider for MySQL" 
      type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.2.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> 
    </DbProviderFactories> 
    </system.data> 

Proprio come il tutorial, mi aspetto EF4 per generare il db per me automaticamente. Invece, lancia una ProviderIncompatibleException, con un'eccezione interna che lamenta il fatto che il database NerdDinners non esiste.

Abbastanza corretto; Sono andato a creare MySql db solo per vedere se le cose avrebbero funzionato, e invece ho ottenuto un'altra ProviderIncompatibleException. Questa volta, "DatabaseExists non è supportato dal provider".

Ammetto che questa è la prima volta che sto esplorando Entity Framework (mi sono concentrato principalmente su Linq su Sql), e tutto questo è in esecuzione sul Code-First CTP rilasciato solo la scorsa settimana. Detto questo, c'è qualcosa che sto facendo di sbagliato qui, o un problema noto che può essere risolto?

+0

Hai ragione, esiste un provider mysql (http://stackoverflow.com/questions/76488/using-mysql-with-entity-framework/848539#848539). È possibile che i bit CTP abbiano dei bug o che al provider MySQL manchi functinoality (o entrambi). – marcind

+0

sei in grado di utilizzare l'appartenenza semplice in MVC 4 con MySQL? –

risposta

25

Giusto, finalmente ha funzionato con alcuni punti di interesse.

  • Impossibile creare un DB, deve esistere già
  • È necessario creare una stringa di connessione per ogni concorso DB utilizzando il nome DbContext (nell'esempio di sopra di una connectionstring deve esistere con il nome di "NerdDinners"), non solo uno predefinito (altrimenti utilizzerà SQL)
  • Verrà utilizzato il nome del nome DBSet che si utilizza per definire il contesto come nome della tabella, quindi fare attenzione quando li si nomina.

Tutto sommato, una strada lunga, ma alla fine ce l'

** Aggiornamento Un altro punto da notare, quando si distribuisce il sito MVC utilizzando MySQL sarà molto simile necessità aggiungere anche una DataFactory al vostro web .config. Di solito a causa della differenza tra i connettori MySql disponibili e le versioni di MySQL supportate. (risposta trovata attraverso altre fonti, dopo molte testa graffiare) Basta aggiungere:

<system.data> 
    <DbProviderFactories> 
     <add name="MySQL Data Provider" 
      invariant="MySql.Data.MySqlClient" 
      description=".Net Framework Data Provider for MySQL" 
      type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> 
    </DbProviderFactories> 
    </system.data> 

come sezione separata per web.config avendo cura di impostare il numero di versione del MySQL.Data.dll si distribuisce con il sito (anche una buona idea di "copiare come locale" le tue DLL MySQL per garantire la compatibilità

+0

Contrassegnato come risposta, poiché hai trovato un modo :). Ottimo lavoro! – Dusda

+0

Hai dovuto creare tu stesso i tavoli o genera le tabelle per te? – DennyFerra

+0

Il framework Entity non è ancora in grado di creare tabelle sfortunatamente, quindi dovrete farlo da soli (notare anche su alcuni host nomi di tablature e nomi di colonne sono case sensitive). – Darkside

2

Un altro punto di interesse - Se aggiungi la voce "MySQL Data Provider" al tuo computer locale.config (C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ machine.config nel mio caso) è quindi possibile connettersi all'istanza MySql tramite Visual Studio ...

2

Questa domanda e risposta è stato molto utile per me la migrazione di un progetto di EF più ampio da SQL a MySQL così ho pensato che vorrei aggiungere i miei appunti e spero che siano utili:

Come notato il nome della stringa di connessione ha per abbinare il nome della classe che estende System.Data.Entity.DbContext.

Non sembra ancora possibile creare tabelle in EF utilizzando il connettore mySQL ma è possibile utilizzare e modificare gli script di creazione SQL per generare le tabelle mySQL.Il modo più semplice che ho trovato per fare questo era di commentare dentro e fuori la funzione OnModelCreating sul DbContext esteso a seconda se il codice fosse necessario per ricreare le tabelle. Se trovo che sto facendo questo più spesso ho intenzione di risolvere questo problema utilizzando l'iniezione di dipendenza e ho classi separate basate su una configurazione mySQL o MSSQL.

Ho trovato più facile accertarmi che le scatole ed i server di sviluppo avessero il connettore mySQL corretto .dll impacchettato nella versione di un pasticcio con DbFactoryProviders nel webconfig. Ottenere la confezione corretta nel pacchetto di sviluppo di progetto/soluzione significava che avevo solo bisogno delle linee di stringa di connessione e non delle linee di DbFactoryProviders che trovavo difficile da lavorare in modo coerente su un certo numero di macchine.

Avevo bisogno di cambiare la Sensibilità Caso dell'identificatore mySQL dall'impostazione che avevo da 0 a 1. Senza questa impostazione l'SQL che EF collegato non riusciva a trovare le tabelle che erano lì a causa dei nomi di case misti dei miei oggetti rispetto a le tabelle dei casi fissi create da mySQL.

Problemi correlati