动态DbContext字符串不起作用
本文关键字:不起作用 字符串 DbContext 动态 | 更新日期: 2023-09-27 18:21:12
我使用的是EF6(数据库优先),我想在settings.settings文件中设置数据库设置(服务器、目录)。我创建了一个这样的分部类:
namespace MyApp
{
public partial class MyAppEntities : DbContext
{
public MyAppEntities(String connString)
: base(BuildConnectionString("SERVERNAME", "DATABASE"))
{
}
private static String BuildConnectionString(String DataSource, String Database)
{
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
sqlBuilder.DataSource = DataSource;
sqlBuilder.InitialCatalog = Database;
sqlBuilder.PersistSecurityInfo = true;
sqlBuilder.IntegratedSecurity = true;
sqlBuilder.MultipleActiveResultSets = true;
return sqlBuilder.ToString();
}
}
}
当我运行我的应用程序(WinForm)时,它不会碰到这个分部类,而是使用EF6:创建的MyAppEntities.Context.cs文件中的MyAppEntitys类
namespace MyApp
{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
public partial class MyAppEntities : DbContext
{
public MyAppEntities()
: base("name=MyAppEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<Table1> Table1 { get; set; }
public virtual DbSet<Table2> Table2 { get; set; }
}
}
在我的应用程序(Form1.cs)中,我正在做这样的事情:
using(MyAppEntities context = new MyAppEntities())
{
var tableData = context.Table1.ToList();
}
我做错了什么?
如果你想一想分部类合并为一个类时的样子,它将有两个构造函数。。。一个取string
,另一个无参数:
public MyAppEntities(String connString)
: base(BuildConnectionString("SERVERNAME", "DATABASE"))
{
}
public MyAppEntities()
: base("name=MyAppEntities")
{
}
当您创建类的实例时,您将调用无参数的实例,该实例使用"name=MyAppEntities"
调用基类,而不是采用字符串并调用BuildConnectionString
方法的构造函数。
MyAppEntities context = new MyAppEntities()
您可以声明额外的分部类来扩展现有的分部类。
partial class MyAppEntities
{
public MyAppEntities(string nameOrConnectionString)
: base(nameOrConnectionString)
{
}
}
将BuildConnectionString
移动到某个位置。。也许是一些助手类。并在DbContext初始化之前传递connectionString
。
var connectionString = DbHelper.BuildConnectionString("SERVERNAME", "DATABASE");
using(MyAppEntities context = new MyAppEntities(connectionString))
{
var tableData = context.Table1.ToList();
}