2014-09-01 12 views
5

Tôi đang sử dụng Khung thực thể và trong giải pháp của tôi có 9 dự án và nó sẽ mở rộng. Vấn đề của tôi là nói chuỗi kết nối trong tệp .config. Khi tôi đã làm như thế này, tôi đã phải kết nối chuỗi cho 4-5 dự án và khi tôi muốn thay đổi kết nối của tôi, việc thay đổi ConnectionStrings đang trở thành nghĩa vụ cho 4 hoặc 5 dự án. Tôi muốn thiết lập chuỗi kết nối trong DbContext constructor. DbContext có thể cung cấp cho tôi khả năng này nhưng tôi không thể xác định providerName.So dbconnection của bối cảnh tự động sử dụng SqlClient nhưng tôi muốn sử dụng nhà cung cấp MySql. Chuỗi kết nối của tôi là:Thiết lập nhà cung cấp và chuỗi kết nối trong EntityFramework cho MySql

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

Ngoài ra tôi không thể chỉ định tên nhà cung cấp trong chuỗi kết nối như "Nhà cung cấp = MySql.Data.MySqlClient". Nó ném ngoại lệ "Từ khóa nhà cung cấp không được hỗ trợ".

Tôi đang thay đổi câu hỏi của mình để dễ hiểu hơn.

Tóm lại, tôi muốn thực hiện điều này.

public class XxContext : DbContext 
{ 

     public XxContext() 
     { 

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

     } 
} 

Nhưng tôi không biết làm thế nào để biết bạn nên sử dụng MySql.Data.MySqlClient (không có tệp cấu hình). Có thể không? Nếu có, tôi có thể làm gì?

+0

Vì vậy, bạn muốn thay đổi Nhà cung cấp trong mã hoặc trong cấu hình? – haim770

+0

Tôi muốn thay đổi mã – ArnesTwin

Trả lời

3

Bạn là connection string used with SqlConnection objects. Vì các đối tượng này chỉ hỗ trợ SQL Server nên bạn không thể sử dụng từ khóa Provider. Hơn nữa, vì bạn đang sử dụng EF, bạn cần chỉ định một chuỗi kết nối khác nhau để sử dụng mô hình cơ sở dữ liệu của bạn, ngữ cảnh và từ khóa Provider. Một điển hình EF connection string sẽ là:

<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> 

Để sử dụng các nhà cung cấp MySQL, hãy xem xét các bước quy định tại this answer:

Entity Framework 6 cung cấp một số thay đổi tinh tế tiện dụng mà viện trợ trong cả hai nhận MySQL làm việc và cũng tạo ra các kết nối cơ sở dữ liệu động. Bắt MySQL làm việc với Entity Framework 6

Thứ nhất, tại thời điểm trả lời tôi câu hỏi này, chỉ Net trình điều khiển kết nối tương thích với EF6 là MySQL Net Connectior 6.8.1 (phiên bản phát triển Beta) mà có thể được tìm thấy tại trang web chính thức của MySQL tại đây.

Sau khi cài đặt, tham khảo các tập tin sau đây từ Visual giải pháp Studio của bạn:

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

Bạn cũng sẽ cần phải sao chép những tập tin này ở đâu đó nơi họ sẽ thể truy cập đến dự án trong thời gian xây dựng, chẳng hạn như bin thư mục.

Tiếp theo, bạn cần thêm một số mục vào tệp Web.config (hoặc App.config nếu trên máy tính để bàn).

Một chuỗi kết nối:

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

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

Ngoài ra thêm các nhà cung cấp, bên trong và nút, tùy ý (đây là một phải tuyệt đối trong phần thứ hai của câu trả lời của tôi, khi đối phó với động được xác định cơ sở dữ liệu) bạn có thể thay đổi nút:

<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> 

Nếu bạn thay đổi defaultConnectionFactory từ kết nối máy chủ sql mặc định , đừng quên xóa các nút được lồng trong nút defaultConnectionFactory. Các MysqlConnectionFactory không có bất kỳ tham số cho các nhà xây dựng của nó và sẽ thất bại nếu các tham số vẫn còn đó.

1

Bạn có thể sử dụng DbProviderFacory được đăng ký trong tệp cấu hình (Xem MSDNSO article).

tập tin cấu hình của bạn nên có một cái gì đó như thế này

<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> 

DbContextIDbContextFactory thực hiện một cái gì đó của bạn như thế này ...

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); 
    } 
} 

Kết nối được cung cấp cho trình tạo ngữ cảnh có thể bao gồm DbProvider theo chương trình. Ngữ cảnh được thiết lập để sở hữu kết nối để nó có thể mở khi sử dụng lần đầu tiên và đóng trên vứt bỏ.

Các vấn đề liên quan