[英]MVC 4 Database First project: Setting DBContext for the life of the controller
我不确定线程的标题是否真的可以解释我的意图,因此我将在此处进行更好的解释。 我是MVC的新手,并且我正在从事一个项目。 我正在连接到Firebird数据库,截至目前,我正在其中一个控制器的Index()中设置连接字符串和连接本身。 这样做的好处是,创建了连接,并将其列表按原样返回给View。 我可以回到视图,然后选择另一个数据库,它将连接到新数据库并正常显示结果。 我知道,做到这一点的更好方法是创建一个DAL类,我敢肯定,但是现在,请耐心等待。
所有这些都很棒。 当您尝试编辑,保存或删除任何内容时,遇到麻烦(您可能会想到)。 显然,这些方法正在查看dbContext,而DBContext没有任何改变。 DBContext不一定由我的连接代码“更新”。 我可以在需要时创建连接,但无法像控制器那样在生命周期内“设置”它。
基本上,我只是在寻求一些建议。 我一直在寻找StackOverflow,我想我已经找到了一些可能对我有帮助的信息,但是这仍然让我有些头疼。 只是试图掌握如何使用DBcontext动态更改整个控制器的连接字符串,而不仅是Index()。
提前致谢。
编辑以显示上下文代码
public partial class Entities : DbContext
{
public Entities()
: base("name=Entities")
{
}
public Entities(string providerString)
: base(new FbConnection(providerString), true)
{
this.Database.Connection.ConnectionString = providerString;
}
这会在返回View()时产生错误; 指数。
更新的控制器代码:
FbConnectionStringBuilder fbBuilder = new FbConnectionStringBuilder()
{
DataSource = dbsource,
Database = dbdir,
UserID = dbuser,
Password = dbpwd,
Dialect = 3,
PacketSize = 8192
};
// Build the FbConnection connection string.
FbConnection fbConn = new FbConnection(fbBuilder.ToString());
db = new Entities(fbConn.ToString());
更新的DBCONTEXT:
public partial class Entities : DbContext
{
public Entities(string fbConn)
: base(new FbConnection(fbConn), true)
{
}
但是,这现在会产生错误:
提供了无效的连接字符串参数或未提供所需的连接字符串参数。
但这没有意义,因为如果我使用this.Database.Connection.ConnectionString,那么我可以连接,因此我知道它得到了一个很好的字符串。
两种选择:
最简单的
向控制器添加属性以保存DbContext
,然后添加将填充的无参数ctor(有效地为其赋予了使用寿命)。 例如
public class MyController : Controller
{
private readonly DbContext context;
public MyController()
{
this.context = new DbContext();
}
// rest of actions reference `context.<whatever>`
}
更多地参与
将控制反转(IoC)引入具有某种形式的依赖注入器(DI)的方程式中。 然后,让实例化程序将解析器放置在控制器中。 新的控制器签名如下所示:
public class MyController : Controller
{
private readonly DbContext context;
public MyController(DbContext context)
{
this.context = context;
}
// rest of actions reference `context.<whatever>`
}
注意:无参数的ctor消失了,但是DependencyResolver将在创建控制器的时候自动插入正确的实例。
从那里,您需要声明DI配置中的哪个实例。 以ninject为例,如下所示:
kernel.Bind<DbContexT>().To<MyDbContext>()
// here's where scope comes in to play:
// for ninject: https://github.com/ninject/ninject/wiki/Object-Scopes
//.InTransientScope();
//.InSingletonScope();
//.InThreadScope();
//.InRequestScope();
通过添加一些解决方法进行了修复。 在下面添加了代码:
Model.context.cs:
public MyDatabaseContext()
: base("name=MyDatabaseContextEntities")
{
}
public MyDatabaseContext(string connectionString)
: base("name=MyDatabaseContextEntities")
{
this.Database.Connection.ConnectionString = connectionString;
}
控制器:
public static string temporaryConnectionString
{
get;
set;
}
FbConnectionStringBuilder fbBuilder = new FbConnectionStringBuilder()
{
//code to build your connection
};
//connectionString defined as a public variable
connectionString = fbBuilder.ToString();
//store to session variable in your DAL
context.DataConnection.DAL.CurrentConnection = connectionString;
temporaryConnectionString = connectionString;
context = new MyDatabaseContext(connectionString);
return View();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.