我正在试图弄清楚我是否缺少某些内容或者某种方式来解决LinqPad中实体框架核心DbContexts
缺乏支持的问题。我已经编译了我的代码,目标是4.6.1(作为suggested on the LinqPad forum)并尝试了#34; Entity Framework V7"司机,但顾名思义,我不相信它是最新的。它仍然要求app.config文件或构造函数的连接字符串。
由于EF Core上下文使用DbContextOptions
来构造而不是连接字符串,我以为我可能会创建一个带有连接字符串的构造函数重载,但是它不会处理底层数据库驱动程序。有没有办法指定工厂来构建上下文?还有其他可能吗?没有LinqPad,我感到很失落。
答案 0 :(得分:6)
最新的EFCore 1.1 LINQPad驱动程序(v1.1.1.1)可以正确使用接受字符串的构造函数(在LINQPad中选择此选项时)。
因此可以添加以下构造函数:
public ApplicationDbContext(string connectionString) : this(new DbContextOptionsBuilder<ApplicationDbContext>()
.UseSqlServer(connectionString).Options)
{ }
这会将此上下文实例硬链接到sql server provider,但至少不会连接到字符串。此外,您的应用程序不太可能尝试使用此构造函数,EF Core永远不会期望/促进ctor。接受字符串。
为了更加安全,您可以将此构造函数包装在#if DEBUG ... #endif
中,以便它永远不会生成。
答案 1 :(得分:5)
驱动程序似乎有错误/根本没有更新。我找到了一种通过修改DbContext来绕过它的方法。
从理论上讲,这应该有效,但事实并非如此:
private string _connectionString;
public ApplicationDbContext(string connectionString) : base()
{
_connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (_connectionString == null)
base.OnConfiguring(optionsBuilder); // Normal operation
// We have a connection string
var dbContextOptionsBuilder = new DbContextOptionsBuilder();
optionsBuilder.UseSqlServer(_connectionString);
base.OnConfiguring(dbContextOptionsBuilder);
}
即使您指定“通过接受字符串的构造函数”,LinqPad EF Core驱动程序仍会继续查找无参数构造函数。这似乎是驱动程序中的一个错误。
然后我给了它想要的东西,一个无参数的构造函数。我不得不硬编码连接字符串,因为没有加载IoC / appsettings.json配置阅读器,我不想在DbContext中单独加载它。但它可以工作,让我在LinqPad中测试我的模型中的EF Core查询。
这对我来说很好用:
private bool _isDebug = false;
public ApplicationDbContext() : base()
{
_isDebug = true;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!_isDebug)
base.OnConfiguring(optionsBuilder); // Normal operation
// We are in debug mode
var dbContextOptionsBuilder = new DbContextOptionsBuilder();
// Hardcoded connection string
optionsBuilder.UseSqlServer("data source=XXXX;initial catalog=XXXX;persist security info=True;user id=XXXX;password=XXXX;MultipleActiveResultSets=True;App=EntityFramework");
base.OnConfiguring(dbContextOptionsBuilder);
}
这是现有public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
的补充。
编辑:请注意,它看起来会覆盖默认行为,在您部署到服务器之前可能无法看到这种行为。