我有一个具有以下结构的类库:
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
构造函数:
所选行包含右连接字符串和下一个-不。因此,我的问题应该听起来如何正确地将连接字符串从DbContextOptionsBuilder
发送到DbContext
构造函数。
Edit2: 我可以通过替换来使其工作
return new Database(builder.Options.ToString());
与
return new Database((builder.Options.Extensions.First() as
SqlServerOptionsExtension).ConnectionString.ToString());
在CreateDbContext
中,但是我不确定这是正确的方法...