2014-09-01 10 views
5

Korzystam z Entity Framework, aw moim rozwiązaniu jest 9 projektów i będzie się powiększać. Mój problem polega na podaniu ciągu połączenia w pliku .config. Kiedy to zrobiłem, musiałem podać ciąg połączenia dla 4-5 projektów i kiedy chciałem zmienić moje połączenie, zmiana ConnectionStrings staje się obowiązkiem dla 4 lub 5 projektów. Chcę ustawić ciąg połączenia w konstruktorze DbContext. DbContext może zapewnić mi tę umiejętność, ale nie mogę zdefiniować providerName.So dbconnection kontekstu automatycznie używa SqlClient, ale chcę użyć dostawcy MySql. Moje ciąg połączenia jest:Ustawienie dostawcy i ciąg połączenia w EntityFramework for MySql

"Server=localhost;Database=xxx;Uid=auth_windows;Persist Security Info=True;User=root;Password=yyyyyy;" 

Również nie mogę podać nazwę dostawcy w ciągu połączenia, takich jak „Provider = MySql.Data.MySqlClient”. Zgłasza wyjątek "Słowo kluczowe dostawcy nie jest obsługiwane".

Zmieniam moje pytanie na bardziej zrozumiałe.

Krótko mówiąc, chcę to zrobić.

public class XxContext : DbContext 
{ 

     public XxContext() 
     { 

      this.Database.Connection.Provider = "MySql.Data.MySqlClient"; 
      this.Database.Connection.ConnectionString = "Server=localhost bla bla bla"; 

     } 
} 

Ale nie wiem jak stwierdzić należy użyć MySql.Data.MySqlClient (bez pliku konfiguracyjnego). Czy to możliwe ? Jeśli tak, jak mogę to zrobić?

+0

Chcesz zmienić dostawcę w kodzie lub konfiguracji? – haim770

+0

Chcę zmienić kod – ArnesTwin

Odpowiedz

3

Pozdrawiam jest connection string used with SqlConnection objects. Ponieważ te obiekty obsługują tylko program SQL Server, nie można użyć słowa kluczowego Provider. Ponadto, ponieważ używasz EF, musisz podać inny ciąg połączenia, aby użyć modelu bazy danych, kontekstu i słowa kluczowego Provider. Typowym EF connection string byłoby:

<connectionStrings> 
    <add name="AdventureWorksEntities" 
     connectionString="metadata=.\AdventureWorks.csdl|.\AdventureWorks.ssdl|.\AdventureWorks.msl; 
     provider=System.Data.SqlClient;provider connection string='Data Source=localhost; 
     Initial Catalog=AdventureWorks;Integrated Security=True;Connection Timeout=60; 
     multipleactiveresultsets=true'" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

Aby korzystać dostawcy MySQL, należy rozważyć następujące kroki przewidziane w this answer:

Entity Framework 6 oferuje kilka przydatnych zmian subtelnych których pomoc zarówno coraz MySQL pracy a także tworzenie dynamicznych połączeń z bazą danych. Pierwsze MySQL pracy z Entity Framework 6

pierwsze, na dzień moje odpowiedzi na to pytanie, tylko .Net sterowniki złącze kompatybilne z EF6 jest MySQL .Net Connectior 6.8.1 (wersja rozwojowa beta), które mogą znaleźć na oficjalnej stronie MySQL tutaj.

Po zainstalowaniu odwołać następujące pliki z Visual rozwiązania Studio:

Mysql.Data.dll 
Mysql.Data.Entity.EF6.dll 

Potrzebny będzie również skopiować te pliki gdzieś, gdzie będą dostępny do projektu w czasie kompilacji, takich jak bin katalogu.

Następnie należy dodać niektóre elementy do pliku Web.config (lub App.config, jeśli na komputerze).

ciąg połączenia:

<connectionStrings> 
    <add name="mysqlCon" 
     connectionString="Server=localhost;Database=dbName;Uid=username;Pwd=password" 

     providerName="MySql.Data.MySqlClient" /> </connectionStrings> 

dodać także dostawcy, wewnątrz i węzłów, ewentualnie (to jest absolutną koniecznością w drugiej części moją odpowiedź, gdy ma do czynienia z dynamicznie zdefiniowane bazy danych) można zmianę węzła:

<entityFramework> 
    <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" /> 
    <providers> 
     <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" /> 
    </providers> </entityFramework> 

Po zmianie właściwości defaultConnectionFactory z domyślnego połączenia z serwerem sql , nie zapomnij usunąć węzłów, które są zagnieżdżone w węźle defaultConnectionFactory. Parametr MysqlConnectionFactory nie pobiera parametrów dla konstruktora i zakończy się niepowodzeniem, jeśli parametry nadal istnieją.

1

Można użyć DbProviderFacory który jest zarejestrowany w pliku konfiguracyjnym (patrz MSDN i SO article).

plik konfiguracyjny powinien mieć coś takiego

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

na implementację czegoś takiego DbContext i IDbContextFactory ...

DbContext

public class MyDbContext 
    : DbContext 
{ 
    public MyDbContext(DbConnection connection, bool contextOwnsConnection) 
     : base(connection, contextOwnsConnection) 
    { 

    } 
} 

IDbContextFactory

public class MyDbContextFactory 
    : IDbContextFactory<MyDbContext> 
{ 
    private readonly string _connectionStringName; 

    public MyDbContextFactory(string connectionStringName) 
    { 
     Contract.Requires<NullReferenceException>(
      !string.IsNullOrEmpty(connectionStringName), 
      "connectionStringName"); 
     _connectionStringName = connectionStringName; 
    } 

    public MyDbContext Create() 
    { 
     var connectionStringSettings = ConfigurationManager 
      .ConnectionStrings[_connectionStringName]; 

     var connection = DbProviderFactories 
      .GetFactory(connectionStringSettings.ProviderName) 
      .CreateConnection(); 

     if (connection == null) 
     { 
      var message = string.Format(
       "Provider '{0}' could not be used", 
       connectionStringSettings.ProviderName); 
      throw new NullReferenceException(message); 
     } 

     connection.ConnectionString = connectionStringSettings 
      .ConnectionString; 
     return new MyDbContext(connection, true); 
    } 
} 

Połączenie z konstruktorem kontekstu jest możliwe dzięki programowemu włączeniu DbProvider. Kontekst jest ustawiony na posiadanie połączenia, dzięki czemu może się otworzyć przy pierwszym użyciu i zamknąć w dyspozycji.