动态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();
}

我做错了什么?

动态DbContext字符串不起作用

如果你想一想分部类合并为一个类时的样子,它将有两个构造函数。。。一个取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();
}