2015-02-09 39 views
5

Tôi có Vấn đề sau. Tôi đang sử dụng Entity Framework 6 và tôi muốn có thể thay đổi cơ sở dữ liệu được sử dụng trong thời gian chạy hoặc ít nhất tôi muốn có thể kiểm tra thông tin kết nối khi được nhập trong Options. Vấn đề của tôi là chúng tôi muốn hỗ trợ MySql và LocalDB v12.0 nên việc trao đổi chuỗi kết nối đơn giản không giúp ích gì ở đây - tôi phải trao đổi ExecutionStrategy và ConnectionFactory.EntityFramwork, sử dụng nhiều cơ sở dữ liệu/kết nối

EF dường như khóa tất cả các cấu hình để tôi không thể thay đổi cấu hình khi chạy, có một workarround cho việc này không? Trong thời điểm này, tôi đã cố tạo một số DbConfigurations và lấy ra một ngữ cảnh cho mỗi cấu hình với định nghĩa là [DbConfigurationType(typeof(LocalDbConfigruation))].

tôi mong đợi này thất bại, nhưng tôi thougt nó sẽ có giá trị một thử;)

Có thể có ai đó ra có những người có thể giúp tôi với một số Tipps và thủ thuật.

Trả lời

0

Ok, vấn đề dường như đã được giải quyết ngay bây giờ. Tôi đang làm việc với DbConnections ngay bây giờ.

public MyContext() : base(ConnectionManager.Connection, true) 
{ 
    Database.SetInitializer<MyContext>(new MyContextInitializer()); 
    Configuration.ProxyCreationEnabled = false; 
} 

public MyContext(DbConnection connection) : base(connection, true) 
{ 
    Database.SetInitializer<MyContext>(new MyContextInitializer()); 
    Configuration.ProxyCreationEnabled = false; 
} 

Tôi tạo DbConnection trong một lớp học đặc biệt, tôi nghĩ không phù hợp để đăng mã ở đây. Nhưng về cơ bản, nó giống như thế này:

DbConnection conn = null; 

switch (Type) 
{ 
    case ConnectionType.LocalDB: 
     conn = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection(); 
     break; 
    case ConnectionType.MySql: 
     conn = DbProviderFactories.GetFactory("MySql.Data.MySqlClient").CreateConnection(); 
     break; 
    default: 
     throw new System.InvalidOperationException(); 
} 

conn.ConnectionString = "Add provider specific connection string here"; 

Sau đó, bạn chỉ cần đưa mã đó vào ngữ cảnh. Trong trường hợp của tôi, tôi có một ConnectionManager từ nơi tôi đọc "kết nối defaul" khi tôi gọi MyContext() và có một Ctor thứ hai mà tôi gọi cho "kết nối thử nghiệm".

1

Có một tùy chọn khác sử dụng ngữ cảnh cơ sở. Trong ví dụ dưới đây tôi đang sử dụng kết nối MSSQL và kết nối Oracle. Bạn có thể mở rộng ngữ cảnh cơ sở cho nhiều loại kết nối cơ sở dữ liệu bạn muốn. Phương pháp này mở ra một tấn khả năng tuyệt vời khác, nhưng nó cũng sẽ làm việc cho tình hình của bạn.

BaseContext.cs

using System.Data.Entity; 

namespace MultipleConnections.Models 
{ 
    public class BaseContext<TContext> : DbContext where TContext : DbContext 
    { 
     static BaseContext() 
     { 
      Database.SetInitializer<TContext>(null); 
     } 

     public BaseContext(string connectionString = "Name=MSSQLEntities") 
      : base(connectionString) 
     {} 
    } 
} 

MSSQLModel.cs

using System.Data.Entity; 

namespace MultipleConnections.Models 
{ 
    // Extending Base Context will use default MSSQLEntities connection 
    public class MSSQLContext : BaseContext<MSSQLContext> 
    { 
     ...apply DbSet<> and other loveliness...   
    } 
} 

OracleModel.cs

using System.Data.Entity; 

namespace MultipleConnections.Models 
{ 
    // Extending Base Context 
    public class OracleContext : BaseContext<OracleContext> 
    { 
     // Declare Oracle connection in Constructor to override default 
     // MSSQL connection 
     public OracleContext() 
      : base("Name=OracleEntities") 
     { } 
     ...apply DbSet<> and other loveliness...   
    } 
} 
+0

Cảm ơn bạn, tôi sẽ xem xét sử dụng soluition của bạn, nó trông khá đẹp :) – SirBirne

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