MVC5在运行时更改数据库连接字符串

时间:2013-12-05 15:16:32

标签: c# asp.net asp.net-mvc connection-string

我正在考虑使用MVC5来补充现有的ASP.Net应用程序(不是MVC)。

首先使用数据库配置应用程序。

我需要在运行时根据登录的人更改数据库连接字符串。(通过数据适配器在当前应用程序中很容易做到这一点。)

现有超过1000个数据库,并且可以在运行时创建更多数据库 - 因此Web.config不是一个选项。架构对所有数据库都是通用的。

到目前为止,我已经设法在Controller上切换数据库 - 但这意味着实质上改变了生成的代码 - 必须有一个更简单的方法! - 帮助!

添加评论:

该模型是SaaS会计应用程序。每个数据库都存储客户公司的所有分类帐,其中包含大约125个表。为了安全性和可移植性,它们是分开的(一些会计师甚至要求为客户整体下载SQL数据。)

示例代码:

该网站建立在Contoso大学模型上: http://www.asp.net/mvc/tutorials/mvc-5/database-first-development/setting-up-database

它以其基本形式工作,但我需要为每个客户端数据更改连接: 所以看看销售总账 - 在销售控制器下我们有:

public class SalesController : Controller
{

    private Sales db = new Sales();

.....

销售定义是:

public partial class Sales : DbContext
{

    public Sales()
        : base("name=Sales")
    {                                                                        
    }

“name = Sales”链接到WebConfig并为其提供起始数据库。

查看:base定义将我带到System.Data.Entity.DbContext,这是一个锁定的文件!

我已经浏览了各种网站,并尝试将连接字符串放在Sales类中,以下是其中一个建议:

public Sales(string connString):base(connString)

但这会引发:

如果在Code First模式下使用,使用T4模板为Database First和Model First开发生成的代码可能无法正常工作。要继续使用Database First或Model First,请确保在执行应用程序的配置文件中指定了Entity Framework连接字符串。要使用这些来自Database First或Model First的类,使用Code First使用属性或DbModelBuilder API添加任何其他配置,然后删除引发此异常的代码

第32行:受保护的覆盖void OnModelCreating(DbModelBuilder modelBuilder)

第33行:{

第34行:抛出新的UnintentionalCodeFirstException();

第35行:}

第36行:

这就是我被困的地方 - 即使我使用与WebConfig中相同的连接字符串!!

(它提到了Code First模式 - 它不是?)

2 个答案:

答案 0 :(得分:1)

您可以让您的数据访问层访问提供其使用的连接字符串的接口吗?同样,如果使用EF,它可能是上下文而不是连接字符串

public interface class IClient
{
    string ConnectionString {get;set;}
}

public class DataAccess
{
    private IClient _connectionString;

    public DataAccess(IClient client)
    {
        _connectionString = client.ConnectionString;
    }
}

这当然会根据您的设计略有变化。我可能会对同一个数据库中的所有客户端进行身份验证,然后根据验证工厂的人员可以返回一个IClient,然后可以由DAL,Repository或您拥有的任何内容使用。 IClient实际上不会只有一个连接字符串或上下文,你可以在那里有其他属性或方法,与需求相关。

在内部,Repository(例如)可能在构造函数中使用该上下文或连接字符串,因此它建立了正确的连接。方法不会改变。

答案 1 :(得分:0)

添加一个新的参数化构造函数,如下所述。 在“Connectionstring”中传递您的连接,如:

string Connectionstring="Data Source=;Initial Catalog=abc;Persist Security Info=True;
User ID=dsds;Password=dsdsd;MultipleActiveResultSets=True";

 public Sales()
        : base("name=Sales")
    {                                                                        
    }

        public Sales(string Connectionstring)
            : base(Connectionstring)
        {

        }