Miałem ostatnio okazję tworzyć małą aplikacyjkę korzystającą z Entity Framework jako technologii dostępu do danych przechowywanych z MySQL. Miało być banalnie: ściągamy oficjalny “konektor” (link), instalujemy i wszystko śmiga jak pszczółka maja na polanie pełnej bzu.
Oczywiście gdyby tak było to pisanie tego posta nie miałoby sensu:). Dwa problemy, w kolejności występowania:
Integracja z Visual Studio 2010
Ku swojej radości znalazłem informację, że wraz z którąś-tam wersją connectora MySQL dodano wsparcie dla Entity Framework. No i cool. Niestety w rzeczywistości okazało się, że w najnowszej oficjalnej wersji (6.2.3) może i jest takie wsparcie, jednak… w instalatorze najwidoczniej brakuje kroku rejestrującego odpowiednie komponenty w Visualu 2010. Po kilkunastu minutach kompletnego WTFa ruszyłem mózgownicą i doszedłem do wniosku, że takie niedopatrzenie po prostu MUSIAŁO być poprawione dość szybko. I miałem rację (jak ja lubię to zdanie!). Wystarczy na stronie konektora przejść z zakładki Generally Available (GA) Releases na Development Releases i ściągnąć najnowszą wersję stamtąd (dla mnie była to 6.3.1, teraz widzę 6.3.2). Po instalacji tego komponentu w Visualu poprawnie widoczny jest provider dla MySQL.
Deployment
Po pokonaniu pierwszego problemu można radośnie zapuścić się w kod. Kolejny zonk jednak spotkał mnie, gdy wrzuciłem aplikację na docelowy serwer (Webio – BTW polecam: niskie ceny, dobra jakość i super support). Przy pierwszej próbie podłączenia do bazy Entity Framework opluło mnie obrzydliwym błędem o niezarejestrowanej DbFactory. No i miało rację: instalator connectora MySQL odpowiednio rejestruje się na poziomie machine.config, jednak hosting wcale nie musi mieć zainstalowanej takiej wersji (szczególnie bety). Rozwiązaniem po raz kolejny okazało się pomyślenie przez chwilę i dodanie do web.configa takiego wpisu (skopiowanego z machine.config):
1: <system.data> 2: <DbProviderFactories> 3: <remove invariant="MySql.Data.MySqlClient" /> 4: <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.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> 5: </DbProviderFactories> 6: </system.data>
Oczywiście należy też dopilnować, aby w katalogu bin/ naszej aplikacji znalazły się biblioteki instalowane przez connector (w C:\Program Files (x86)\MySQL\MySQL Connector Net 6.3.1\Assemblies lub okolicach).
W ten oto sposób dwa proste dodatkowe kroki umożliwiają zastosowanie MySQL z EntityFramework w VS 2010 na hostingu, którego nie kontrolujemy w 100%.
Jakieś pół roku temu zmagałem się z identycznymi problemami:) Z tym że na VS2008, bo VS2010 był w wersji beta toteż Connectora do niego nie było.
Rozwiązanie jest rewelacyjne, sprawdza się w 200% – polecam! ;)