我一直在阅读很多文章,解释如何设置实体框架,DbContext
以便每个HTTP Web请求只使用各种DI框架创建和使用一个.
为什么这首先是一个好主意?使用这种方法有什么好处?在某些情况下这是个好主意吗?在使用DbContext
存储库方法调用实例化s 时,您是否可以使用此技术执行某些操作?
如何从web.config
文件中读取连接字符串到类库中包含的公共类?
我试过了:
WebConfigurationManager
ConfigurationManager
Run Code Online (Sandbox Code Playgroud)
但是这些类在我的类库中无法识别.
我主要将 dbcontext 与 using 语句一起使用,如下所示:
using (var context = new MyContext())
{
}
Run Code Online (Sandbox Code Playgroud)
但是后来我不得不添加一个带有更改数据库功能的项目。我发现我可以将我的 dbcontext 构造函数更改为:
public MyContext(string connectionstring)
: base(connectionstring)
{
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个带有连接字符串属性的类:
public static class DbAccessor
{
public static string ConnectionStringForContext { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我在开始时设置了这个属性,我的 using 语句如下所示:
using (var context = new MyContext(DbAccessor.ConnectionStringForContext)
{}
Run Code Online (Sandbox Code Playgroud)
它有效,但我的连接字符串现在无处不在,我觉得我不应该对连接字符串这样做。有没有更好的方法来做到这一点?如果我想更改连接字符串,最好的处理方法是什么?我应该停止使用这些 using 语句吗?
我见过这个问题:Entity Framework change connection at runtime
但不同的是,我有一个有效的解决方案,但我不想到处都有我的连接字符串。如果我在每个 using 语句中都使用了该扩展方法。这几乎就像我的解决方案在每个 using 语句中仅多一行...
winforms应用程序中关于EF的信息并不多。在他的 msdn 页面上,我们发现:
使用 Windows Presentation Foundation (WPF) 或 Windows 窗体时,请为每个窗体使用一个上下文实例。这使您可以使用上下文提供的更改跟踪功能。
所以我认为我不应该使用:
using (var context = new MyAppContext())
{
// Perform operations
}
Run Code Online (Sandbox Code Playgroud)
但我应该在每个MyAppContext
表单的加载时创建一个新的,并在表单关闭时(也可以选择之前)释放它。SaveChange()
这是对的吗 ?
如果是,我如何在运行时更改整个应用程序的数据库?
我使用数据库第一种方法创建了我的模型.问题是我的连接字符串在运行时更改.因此,我为DBContext类添加了一个重载的构造函数,它接受连接字符串.
public partial class MyDataContext: DbContext
{
public MyDataContext: ()
: base("name=DbEntities")
{
}
// added this overloaded contructor
public MyDataContext: (string connectionString)
: base(connectionString)
{
}
Run Code Online (Sandbox Code Playgroud)
我在运行时获得的连接字符串如下所示.
Integrated Security=SSPI;Data Source=localhost\sqlexpress;initial catalog=MyDatabase;Max Pool Size=100;Min Pool Size=20;Connect Timeout=15;
Run Code Online (Sandbox Code Playgroud)
然而,当我使用使用重载构造函数创建的MyDataContext运行查询时,我得到以下错误.
System.Data.Entity.Infrastructure.UnintentionalCodeFirstException:在Code First模式下使用上下文,其中包含从EDMX文件生成的用于Database First或Model First开发的代码.这将无法正常工作.要解决此问题,请不要删除引发此异常的代码行.如果您希望使用Database First或Model First,请确保Entity Framework连接字符串包含在启动项目的app.config或web.config中.如果要创建自己的DbConnection,请确保它是EntityConnection而不是其他类型的DbConnection,并将其传递给采用DbConnection的基本DbContext构造函数之一.要了解有关Code First,Database First和Model First的更多信息,请参阅此处的Entity Framework文档:http: //go.microsoft.com/fwlink/?LinkId = 394715
知道如何实现这一目标吗?