我正在考虑使用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模式 - 它不是?)
答案 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)
{
}