IDesignTimeDbContextFactory实现中的数据库更新期间传递了错误的连接字符串

时间:2018-11-20 13:30:47

标签: c# entity-framework-core

我有一个具有以下结构的类库:

namespace Layers
{
  public class DatabaseLayer 
  {
      private Database _database;

      public string ConnectionString {get; set; }
  }
}

namespace Models
{
  public class DatabaseBase : DbContext, IDisposable
  {
    private DbConnection _connection;
    private DbCommand _command;

    public string ConnectionString {get; set; }
  }

  public class Database : DatabaseBase
  {
    internal Database(string connectionString) : base(connectionString) { }

    public virtual DbSet<FileEntity> Files { get; set; }
  }
}

我添加了IDesignTimeDbContextFactory接口的实现,以避免出现消息无法创建“数据库”类型的对象。将“ IDesignTimeDbContextFactory”的实现添加到项目中

namespace Models
{
  public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<Database>
  {
    public Database CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<Database>();
        var connectionString = @"Server=MyInstanceName;Database=MyDatabaseName;Trusted_Connection=True;";

        builder.UseSqlServer(connectionString, b => b.MigrationsAssembly("MyAssemblyName"));

        return new Database(builder.Options.ToString());
    }
  }
}

当我尝试运行update-database -Context Database时,我得到

  

System.ArgumentException:初始化字符串的格式不正确   从索引0开始符合规范。   System.Data.Common.DbConnectionOptions.GetKeyValuePair(字符串   connectionString,Int32 currentPosition,StringBuilder缓冲区,布尔值   useOdbcRules,字符串和键名,字符串和键值)位于   System.Data.Common.DbConnectionOptions.ParseInternal(Dictionary 2 parsetable, String connectionString, Boolean buildChain, Dictionary 2   同义词,布尔值firstKey)在   System.Data.Common.DbConnectionOptions..ctor(字符串connectionString,   字典中的2个同义词)

很明显,问题出在我的connectionString中,但是我是从测试项目中照原样复制的,并且在这里效果很好(通过了连接测试)。

我想念什么?我正在使用EF Core和.NET Core 2.1。

修改 我在调试器下运行代码,发现错误的连接字符串发送到Database构造函数:

  

"Microsoft.EntityFrameworkCore.DbContextOptions`1[DELay.Classes.DataModel.Database]"

所选行包含右连接字符串和下一个-不。因此,我的问题应该听起来如何正确地将连接字符串从DbContextOptionsBuilder发送到DbContext构造函数。

Edit2: 我可以通过替换来使其工作

return new Database(builder.Options.ToString());

return new Database((builder.Options.Extensions.First() as 
  SqlServerOptionsExtension).ConnectionString.ToString());

CreateDbContext中,但是我不确定这是正确的方法...

0 个答案:

没有答案