2011-09-08 3 views
22

Sto utilizzando .NET MySQL Connector con Entity Framework 4 e tutto ha funzionato alla perfezione ma volevo comprimere i file DLL client MySQL con la mia applicazione quando distribuito sui server, quindi non abbiamo per preoccuparsi dell'installazione di mysql su ciascun server, ogni applicazione avrà solo la copia corretta di cui ha bisogno.Connettore MySQL .NET in conflitto DbProviderFactories

per rendere questo possibile, ho fatto in modo i riferimenti MySQL avevano "copia locale" impostato in modo che sarebbero stati copiati nelle cartelle bin e ha aggiunto il seguente al mio app.config:

<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.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> 
    </DbProviderFactories> 
</system.data> 

Questo funziona e Sono in grado di distribuire l'app senza installare mysql sul server remoto, ma ora ho un problema sulla mia macchina locale dev (dove I do ha il connettore MySQL installato), e sto ricevendo questo errore quando EF cerca di connect:

La colonna "InvariantName" è vincolata per essere univoca. Valore 'MySql.Data.MySqlClient' è già presente.

Se commento l'XML che ho aggiunto in app.config, l'errore scompare. Ciò è probabile perché lo stesso driver è installato sul sistema e si trova in machine.config.

Qual è la soluzione? Preferirei non dover commentare e decommentare manualmente la linea a seconda del sistema per cui costruisco l'applicazione.

risposta

43

provare ad aggiungere < rimuovere invariant = "MySql.Data.MySqlClient" /> nel webconfig. Sul tuo computer, hai installato il connettore per MySql e il tuo computer.config è stato modificato aggiungendo un elemento in DbProviderFactories. Quindi se metti un altro MySql Data Provider nel tuo web.config, è come se cercassi di registrare la stessa cosa due volte.

<system.data> 
    <DbProviderFactories> 
     <remove invariant="MySql.Data.MySqlClient" /> 
     <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.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> 
    </DbProviderFactories> 
</system.data> 
+1

Funziona perfettamente sul server e sulla macchina locale. Grazie! – Kekoa

+1

Anche io stavo avendo questo problema, e questo ha funzionato come un fascino. Ho pensato che sarebbe stato qualcosa di simile ma non ho pensato di provare la parola chiave invariante. –

+1

Questo ha funzionato anche per me! Grazie mille :) – DigitalRayne

0

si può anche considerare di copiare tutte le DLL MySQL da C:\Program Files (x86)\MySQL\MySQL Connector Net 6.8.3\Assemblies\v4.0 nella cartella bin del progetto. In questo modo EF6 può raggiungere tutte le sottoclassi di MySQL (MySql.Data) richieste.