2013-08-06 59 views
1

我正在遇到搜索/查找此方案示例的心理障礙。SQL Server,Entity Framework多個動態連接字符串,

用戶-A登錄並連接到「abcServer」上的「主」數據庫以驗證帳戶。 一旦批准,服務器將「unique-A」數據庫的連接字符串返回給「abcServer」上的用戶A.

我知道的DbContext在EF具有構造函數分配CONNSTRING的名字,但我想這是動態的:

(1)的DbContext

// dbContext constructor 
    public MasterDatabase() : base("name=MasterDatabase") 
    { 
     Configuration.LazyLoadingEnabled = false; 
    } 

(2)默認連接

// web.config 
    <connectionStrings> 
    <add name="MasterDatabase" connectionString="Data Source=abcServer;Initial  
     Catalog=Master;Integrated Security=True;" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

但是,這是它的HA connStr的rd編碼。該項目的其餘部分是關於在他/她的db中使用EF類的相應用戶,直到從成功登錄返回連接字符串纔會被確定。是這樣的:

(3)在控制器的方法改變康恩串

// in api controller, once log in successful, call to method return value as parameter 
    private void Connect2DbwithThisUsersConnString(string connStr) 
    { 
    // change the conn string & USE THIS CONTEXT to this user's db 
    } 

的這個任何asp.net/mvc例子?提前致謝。在這裏堅果。

請記住:我不知道連接字符串,直到登錄。這可能是一個新用戶,需要一個新的數據庫即時創建和connStr傳遞。我無法硬編碼一個唯一的dbContext「base」或conn字符串。

非常感謝您的關注!

回答

0

在實例化它之後更改DbContext連接字符串非常困難(如果不是不可能的話)。

你可以讓你的UniqueConnString函數返回一個新的DbContext和你MasterDatabase類中創建一個新的構造函數接受使用this構造函數中的DbContext連接字符串

private MasterDatabase GetUniqueConnString(string connStr) 
{ 
    return new MasterDatabase(connStr); 
} 


public MasterDatabase() : this("name=MasterDatabase") 
{ 
} 
public MasterDatabase(string nameOrConnectionString) : base(nameOrConnectionString) 
{ 
    Configuration.LazyLoadingEnabled = false; 
} 
1

您正在尋找實體框架多租戶用每用戶分片方法。

您需要兩個完全獨立的EF上下文。一個在conf文件中帶有連接字符串的登錄數據庫。此上下文僅包含與登錄相關的對象/表。驗證登錄後,將從登錄數據庫(EF上下文)中檢索租戶特定位置,並使用包含每個租戶對象/表的不同EF上下文來處理實際數據。該上下文使用適當構造的連接字符串打開。仍然有許多問題需要解決,主要是如何解決模式更改和數據庫升級(遷移)這個不重要的問題。

您還應該閱讀關於Entity Framework and Federations的不同方法,以瞭解SQL Azure聯合。

+0

Remus,我不想使用Azure。任何使用獨立MsSql服務器的例子?對不起,錯字,非天青例子的任何鏈接? –

+0

我的回覆是關於非天藍色的版本。只有最後的意見是建議聯盟作爲替代方案。 –

+0

所有用戶都共享相同的上下文,但在差異dbs。如果我對這些類進行了更改,並且遷移設置爲true,那麼我無法看到架構更改和數據庫升級的問題。 –

0

這對我有用,有人看到錯誤或知道更好的方法嗎?

// in controller/server // 
private static void Init(string connStr) 
var connString = "Data Source=abcServer;Initial Catalog=" + dbName + ";Integrated Security=True;"; 
var connBuilder = new SqlConnectionStringBuilder(connString); 
var defaultContext = new DefaultDb(); //Context #1 - default connection from web.config 
var otherContext = new OtherDb(connBuilder.ToString()); //Context #2 dynamic connection 
..... 
} 

// in OtherContext.cs // 
    public partial class OtherContext 
    { 
     public OtherContext(string connectionString) : base(connectionString) { } 
    } 

    public partial class OtherContext: DbContext 
    { 
     public OtherContext() : base("name=DefaultConnection") { } 
    } 

    // the migration file // 
    public class Configuration : DbMigrationsConfiguration<OtherContext> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = true; 
      AutomaticMigrationDataLossAllowed = true; 
     } 
    }