【问题标题】:SQL Server, Entity Framework multiple dynamic connections string,SQL Server、Entity Framework 多个动态连接字符串,
【发布时间】:2013-08-07 03:48:02
【问题描述】:

我在搜索/查找此场景的示例时遇到了心理障碍。

User-A 登录并连接到“abcServer”上的“master”数据库以验证帐户。 一旦获得批准,服务器将“unique-A”数据库的连接字符串返回给“abcServer”上的用户A。

我知道 EF 中的 dbContext 具有分配 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>

但是,这就是 connStr 的硬编码。项目的其余部分是关于在他/她的数据库中使用 EF 类的各个用户,直到从成功登录返回连接字符串才能确定。像这样的:

(3)控制器改变conn字符串的方法

   // 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 字符串。

非常感谢您的关注!

【问题讨论】:

    标签: sql-server asp.net-mvc entity-framework


    【解决方案1】:

    您正在寻找具有每用户分片方法的实体框架多租户。

    您需要两个完全独立的 EF 上下文。一,在 conf 文件中使用连接字符串,连接到登录数据库。此上下文仅包含与登录相关的对象/表。验证登录后,将从登录数据库(EF 上下文)中检索租户特定位置,并使用包含每个租户对象/表的不同 EF 上下文来操作实际数据。使用适当构造的连接字符串打开此上下文。您仍然需要解决许多问题,主要是关于如何解决架构更改和数据库升级(迁移)等重要问题。

    您还应该阅读Entity Framework and Federations,了解基于 SQL Azure 联合的不同方法。

    【讨论】:

    • 莱姆斯,我不想使用 Azure。有独立 MsSql 服务器的示例吗?抱歉打错了,非天蓝色示例的任何链接?
    • 我的回答是关于非天蓝色的版本。只有最后几行建议联邦作为替代方案。
    • 所有用户共享相同的上下文,但在 diff dbs 中。如果我对类进行更改,并将迁移设置为 true,我将看不到架构更改和数据库升级的问题。
    【解决方案2】:

    在实例化后更改 DbContext 连接字符串非常困难(如果不是不可能的话)。

    您可以让您的 UniqueConnString 函数返回一个新的 DbContext 并在您的 MasterDatabase 类中创建一个新的构造函数,使用 DbContext 中的 this 构造函数接受连接字符串

    private MasterDatabase GetUniqueConnString(string connStr)
    {
        return new MasterDatabase(connStr);
    }
    
    
    public MasterDatabase() : this("name=MasterDatabase")
    {
    }
    public MasterDatabase(string nameOrConnectionString) : base(nameOrConnectionString)
    {
        Configuration.LazyLoadingEnabled = false;
    }
    

    【讨论】:

      【解决方案3】:

      这对我有用,有人看到错误或知道更好的方法吗?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-06
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        相关资源
        最近更新 更多