簡體   English   中英

在運行時更改DbContext連接

[英]Change DbContext connection at run-time

我有3個我想要使用的DB:A,B和C.每個都有相同的表(例如:用戶,產品)。

我想讓用戶決定(在運行時)他想要使用哪個DB。 所以...我使用了EF5並創建了3個edbx文件,這些文件創建了以下類:ADBEntities,BDBEntities和CDBEntities。

我如何讓他決定所選的db以便我可以獲得其用戶?

我的意思是,

var dstuff = from user in selecteddb.users
             where user.UserEmail == userEmail
             select user.UserID;

我曾想過使用反射/基類(DBEntities),但沒有對這些想法有所了解。

這個答案有點晚了,但我認為用一個簡潔的小擴展方法有可能做到這一點。 正如slypete(好名字:-))所說,你只需要一個類模型,假設所有表/屬性都相同。 在這種情況下,我們可以利用EF約定優於配置以及一些小框架調用。

無論如何,沒有進一步說,注釋的代碼和示例用法:

擴展方法類:

public static class ConnectionTools
{
    // all params are optional
    public static void ChangeDatabase(
        this DbContext source,
        string initialCatalog = "",
        string dataSource = "",
        string userId = "",
        string password = "",
        bool integratedSecuity = true,
        string configConnectionStringName = "") 
        /* this would be used if the
        *  connectionString name varied from 
        *  the base EF class name */
    {
        try
        {
            // use the const name if it's not null, otherwise
            // using the convention of connection string = EF contextname
            // grab the type name and we're done
            var configNameEf = string.IsNullOrEmpty(configConnectionStringName)
                ? source.GetType().Name 
                : configConnectionStringName;

            // add a reference to System.Configuration
            var entityCnxStringBuilder = new EntityConnectionStringBuilder
                (System.Configuration.ConfigurationManager
                    .ConnectionStrings[configNameEf].ConnectionString);

            // init the sqlbuilder with the full EF connectionstring cargo
            var sqlCnxStringBuilder = new SqlConnectionStringBuilder
                (entityCnxStringBuilder.ProviderConnectionString);

            // only populate parameters with values if added
            if (!string.IsNullOrEmpty(initialCatalog))
                sqlCnxStringBuilder.InitialCatalog = initialCatalog;
            if (!string.IsNullOrEmpty(dataSource))
                sqlCnxStringBuilder.DataSource = dataSource;
            if (!string.IsNullOrEmpty(userId))
                sqlCnxStringBuilder.UserID = userId;
            if (!string.IsNullOrEmpty(password))
                sqlCnxStringBuilder.Password = password;

            // set the integrated security status
            sqlCnxStringBuilder.IntegratedSecurity = integratedSecuity;

            // now flip the properties that were changed
            source.Database.Connection.ConnectionString 
                = sqlCnxStringBuilder.ConnectionString;
        }
        catch (Exception ex)
        {
            // set log item if required
        }
    }
}

用法:

// assumes a connectionString name in .config of ADBEntities
var selectedDb = new ADBEntities();
// so only reference the changed properties
// using the object parameters by name
selectedDb.ChangeDatabase
    (
        initialCatalog: "name-of-bdb-initialcatalog",
        userId: "jackthelad",
        password: "nosecrets",
        dataSource: @".\sqlexpress" // could be ip address 100.23.45.67 etc
    );

我目前正在將此用於上面提到的目的,到目前為止,它對我很有幫助。 希望它對您的實例有所幫助。

創建DbContext時傳遞適當的連接字符串/連接名稱

http://msdn.microsoft.com/en-us/library/gg679467%28v=vs.113%29.aspx

using (var context = new MyDbContext("Server=localhost;Database=dbA;..."))
{
    return context.Users.Where(u => u.Email == "someemail@google.ca").Single();
} 

假設數據庫是相同的,您只需要使用其中一個生成的類。 你不需要全部三個(因為它們是相同的)。 所以我們選擇一個 - 讓我們說ADBEntities

現在,您需要允許她在運行時選擇她的連接(連接字符串)。 如果您的app.config / web.config中存儲了三個連接字符串,則可以使用ConfigurationManager在運行時加載它們:

var connections = ConfigurationManager.ConnectionStrings;

提出選擇並以某種方式選擇其中一個:

foreach (ConnectionStringSettings connection in connections)
    //display connection.Name

ConnectionStringSettings selected_connection = connections[1];

其中一個DBContext的構造函數接受一個連接字符串,因此只需將用戶選擇的連接字符串傳遞給ADBEntities的構造ADBEntities

using (var selecteddb = new ADBEntities(selected_connection.ConnectionString))
{
    var dstuff = from user in selecteddb.users
         where user.UserEmail == userEmail
         select user.UserID;
} 
var defaultString = _myContext.Database.GetDbConnection().ConnectionString;
_myContext.Database.GetDbConnection().ConnectionString ="new connection" or _myContext.Database.GetDbConnection().ChangeDatabase()
//your query..
_myContext.Database.GetDbConnection().ConnectionString = defaultString;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM