2012-07-04 7 views
7

Widziałem już wątki omawiające użycie Entity Framework i PostgreSQL z oficjalnymi instrukcjami. Instrukcje te muszą uruchamiać gacutil dla każdej instalacji, która nie jest tak przydatna do celów wdrażania.Jak korzystać z Entity Framework + PostgreSQL z połączenia?

Co chcę tutaj zrobić, to przekazywanie połączenia PostgreSQL bezpośrednio do konstruktora DbContext. To mi wystarcza, ponieważ zamierzam użyć CodeFirst bez projektanta. To co mam zrobić:

public class Context : DbContext 
{ 
    Context(System.Data.Common.DbConnection connection) 
     : base(connection, true) 
    { 
    } 

    public static Context CreateContext() 
    { 
     NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=postgres;Password=********;Database=xxx;"); 
     conn.Open(); 

     return new Context(conn); 
    } 
} 

Ale za pomocą tej metody dostaję NotSupportedException z komunikatem:

Nie można określić nazwę dostawcy dla połączenia typu „Npgsql.NpgsqlConnection”.

Co należy zrobić?

+0

Wydaje się, że pracujesz dla mnie – user007

Odpowiedz

4

Musisz zarejestrować dostawcę Npgsql w wersji app/web.config. Zobacz rozdział 3.4 Using Npgsql with ProviderFactory podręcznika Npgsql.

Po zainstalowaniu dostawcy ADO.NET dla baz danych (MySQL, PostgreSQL itp.) Instalatorzy zazwyczaj rejestrują zestaw dostawcy w GAC i dodają wpis do machine.config. Jeśli chcesz wdrożyć bez instalowania dostawcy, musisz dołączyć kopię zespołu dostawcy (ustaw odwołanie do zestawu Npgsql jako Kopiuj lokalny dla twojego projektu) i dodaj wpis do aplikacji: app/web.config w następujący sposób:

<configuration> 
    ... 
    <system.data> 
    <DbProviderFactories> 
     <clear /> 
     <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql Server" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.1.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" /> 
    </DbProviderFactories> 
    </system.data> 
    ... 
</configuraiton> 

Upewnij się, że wersja jest zgodna z wersją zespołu Npgsql, w którym jest zainstalowany (lub po prostu pomiń wersję/kulturę/klucz publiczny). <Clear /> jest tam, aby uniknąć konfliktów, jeśli działa na komputerze, który już ma wpis dla Npgsql w jego machine.config. Bez niej dostaniesz wyjątek. Jednakże zakłada to również, że nie polegasz na żadnych innych dostawcach określonych w machine.config dla swojej aplikacji.