C# Asp.NETMVC中的实体框架
我的ASP.NETMVC应用程序必须在运行时连接到多个数据库。我可以重载类以在运行时接受连接字符串,如下所示C# Asp.NETMVC中的实体框架,c#,asp.net-mvc-3,entity-framework,C#,Asp.net Mvc 3,Entity Framework,我的ASP.NETMVC应用程序必须在运行时连接到多个数据库。我可以重载类以在运行时接受连接字符串,如下所示 class MyClassDBContext:DbContext { public MyClassDBContext(string str) : base(str) { this.Database.Connection.ConnectionString = str; } } 目前,我正在从数据库表中检索此连接字符串。我的工作流程如下 网站使用存储在中的凭据连接到默认
class MyClassDBContext:DbContext
{
public MyClassDBContext(string str) : base(str)
{
this.Database.Connection.ConnectionString = str;
}
}
目前,我正在从数据库表中检索此连接字符串。我的工作流程如下
我现在面临的问题是保持代码干净。每次我需要2号数据库的连接字符串时,我都必须在默认数据库中查找它。有没有更干净的方法?我考虑将连接字符串存储在配置文件数据中,但我不确定这是否是一个好主意。我的网站的每个用户都需要连接最多2-3个不同的数据库,具体取决于他们的凭据。我个人会将所有连接字符串放在App.Config文件中,并使用一个简单的IOC实现 实际上,Nuget的ninject软件包可能非常适合您的需要 这就是我的意思。希望这能让你的代码变得干净。我在以前的项目中使用了完全相同的模式,效果很好 您可以更进一步,在global.asax中创建服务定位器并注册服务。如果你对此感兴趣,请告诉我。还可以查看ninject
public interface IService()
{
string GetConnectionString();
void DoStuff();
}
public class DBServiceOne : DbContext, IService
{
protected string GetConnectionString()
{
return ConfigurationManager.AppSettings["DBServiceOneConnectionString"]
}
public DBServiceOne(string str) : base(str)
{
this.Database.Connection.ConnectionString = GetConnectionString()
}
public void DoStuff() { //logic goes here }
}
public class DBServiceTwo : DbContext, IService
{
public DBServiceTwo(string str) : base(str)
{
this.Database.Connection.ConnectionString = GetConnectionString();
}
protected string GetConnectionString()
{
return ConfigurationManager.AppSettings["DBServiceTwoConnectionString"]
}
public void DoStuff() { //logic goes here }
}
public class DBServiceThree : DbContext, IService
{
public DBServiceThree(string str) : base(str)
{
this.Database.Connection.ConnectionString = GetConnectionString();
}
protected string GetConnectionString()
{
return ConfigurationManager.AppSettings["DBServiceThreeConnectionString"]
}
public void DoStuff() { //logic goes here }
}
现在开始实现——在控制器上使用构造函数注入
//This could be in your home controller
public class HomeController : AsyncController
{
private IService DBOneService;
private IService DBTwoService;
private IService DBThreeService;
public HomeController(IService one, IService two, IService three)
{
DBOneService= one;
DBTwoService = two;
DBThreeService = three;
}
public HomeController() : this(new DBServiceOne(), new DBServiceTwo(), new DBServiceThree()) {}
public ActionResult Index() {
DBOneService.DoStuff(); //here you'd want to return a list of data and serialize down with json or populate your razor template with it. Hope this helps!
}
我有一个稍微不同的问题。我连接到的数据库取决于产品导入的状态。在导入过程中,将附加和分离数据库。当前可用的数据库存储在“默认数据库”中 我遇到的主要问题是,我必须关闭连接池,否则在分离数据库并再次连接它们之后,将存在无效的连接状态 这对你来说可能不是问题
除此之外,我将当前Connectionstring存储在应用程序状态中。仅在每60秒后,我再次查询“默认数据库”。您必须通过使用锁定来注意多线程问题。为什么不在web.config中定义所有连接字符串?@m0s-不同的客户端连接到不同的数据库。我提前考虑了一下,觉得随着我的客户端数量的增加,web.config会变得杂乱无章。请确保您正在对存储在默认数据库中的连接字符串进行加密。。。顺便说一句,我对我的一个桌面应用程序做了完全相同的事情,我也经历了同样的阶段,想知道是否有更好的方法,但没有找到,所以我很想看看是否有人可以发布更好的解决方案…@Dean K-是的,我已经加密了我的连接字符串。感谢您将其添加为注释,因为这是一个非常有价值的步骤,许多开发人员都会跳过这一步来了解详细的代码。我不确定这是否会减少我的工作流程,因为每次我都必须查找默认数据库,以检查用户必须连接到哪个辅助数据库。也许我可以用你的代码和我的代码创建一个混合体。我可以将数据库名称存储在用户配置文件中,然后从配置文件中查找连接字符串。我会等着看是否有人有更好的主意。如果没有,我将接受您的解决方案作为答案。为什么数据库中的db连接字符串是放在首位的?能否将所有数据库连接到一个数据库中?那么,当需要更改连接字符串时会发生什么情况?仅仅更新app.config是不够的…@David Johnson-不幸的是,这不是我的决定。我正在开发的应用程序的业务规则要求每个客户都有自己的数据库。根据客户对托管的偏好,这些数据库也可以位于不同的位置。这就是为什么我一直使用存储在表中的连接字符串。我还应该提到,所有这些数据库中都有相同的表。唯一的区别在于,存储的数据中所有数据库都有相同的精确表对于这种模式来说并不一定是坏事。查询可以完全相同。如果您不喜欢实现,或者希望将其抽象到一个抽象级别,那么创建一个抽象基类并让它实现接口。使所有DBService类继承该类,然后重写它们。实际上,你也可以用虚拟方法把它变成一个抽象类。这样你就可以提供一个默认的实现,这就是我要走的路线。如果你想让我给你看,就告诉我。