在 Startup.cs 中添加 DbContextOptions 未注册数据存储
Posted
技术标签:
【中文标题】在 Startup.cs 中添加 DbContextOptions 未注册数据存储【英文标题】:Adding DbContextOptions in Startup.cs not registering data store 【发布时间】:2015-07-08 19:58:45 【问题描述】:我的问题是下面的代码在启动期间没有注册数据存储。这是我在应用程序响应中得到的特定“错误”声明:
An unhandled exception occurred while processing the request.
InvalidOperationException: No data stores are configured. Configure a data store by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services.
Microsoft.Data.Entity.Storage.DataStoreSelector.SelectDataStore(ServiceProviderSource providerSource)
在 ConfigureServices(IServiceCollection services) 中,我试图在 lambda 中为我的 DbContext 指定 DbContextOptions。代码:
services.AddEntityFramework(Configuration)
.AddSqlServer()
.AddDbContext<MyDbContext>(
options =>
options.UseSqlServer(Configuration.Get("Data:DefaultConnection:ConnectionString"))
);
在我的 DbContext 中,我有一个将选项发送到基础代码的构造函数:
public MyContext(DbContextOptions options) : base(options)
我在启动时读取的配置文件 config.json 包含这个连接字符串:
"Data":
"DefaultConnection":
"ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=MyDbName;Trusted_Connection=True;MultipleActiveResultSets=True;"
我以前用过
protected override void OnConfiguring(DbContextOptions options)
options.UseSqlServer(Startup.Configuration.Get("Data:DefaultConnection:ConnectionString"));
在我的 DbContext 中成功。它注册了数据存储并且可以正常工作,但我宁愿使用 lambda 方式。
如果需要更多信息,我会提供。
【问题讨论】:
是的,似乎 Lambda 方式在 beta 4 中无法正常工作,我在尝试执行迁移时遇到了同样的问题 @RonDeFreitas 是的,我目前在 beta3 上,但我想我只需要等到他们修复它,只是觉得 github 上的 EF 7 以 lambda 方式为例很奇怪关于如何设置 DbContextOptions。顺便说一句,很高兴知道我在这件事上并不孤单。 【参考方案1】:您是将上下文注入控制器还是在使用它的任何地方?我发现如果你尝试新建上下文而不是注入它,它不会使用 Startup.cs 中指定的配置
【讨论】:
我正在注入我的 DbContext。所以,这并不可悲。 Wierd... 这是我在 beta4 上的上下文,它运行良好 services.AddEntityFramework() .AddSqlServer() .AddDbContext(options => options.UseSqlServer(Configuration["Data:DefaultConnection :ConnectionString"])); 感谢分享,我明天试试。如果不麻烦的话,我也将升级到 beta4。从 beta2 开始,在 2 和 3 之间升级很痛苦。 Microsoft.MVC 中的迁移和类重命名,不好玩。明天我会告诉你进展如何。 从 3->4 迁移也很糟糕 我已经在 beta3 中尝试过您的示例代码,但不适用于我的项目,仍然出现同样的错误。在 config.json 中,名称与您的名称相同。我决定选择一个在启动时读取配置文件的静态类,当我的 DbContexts 需要该信息时,他们会向静态类询问它。我有一个项目结构,我在它自己的项目中将 dbcontext 与我的存储库分开。不过还是谢谢!那么我不会迁移到 beta4,项目明天到期,是的。【参考方案2】:我(仍然)对 EF7 和 beta 4 有同样的问题。这是我在数据上下文中的解决方法:
public class AspNetDataContext : IdentityDbContext, IDataContext
private readonly string _connectionString;
public DbSet<Player> Players get; set;
public AspNetDataContext(DbContextOptions options)
_connectionString = ((SqlServerOptionsExtension)options.Extensions.First()).ConnectionString;
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
optionsBuilder.UseSqlServer(_connectionString);
我从选项中提取连接字符串并在 OnConfiguring 方法中使用它。这仍然不是我们想要的解决方案,但我不必更改 Startup.cs 中的某些内容(那里的所有内容都与您描述的一样)。一旦解决了这个问题,您只需从数据上下文类中删除这些东西。 也许有人对这个问题有另一种(甚至更好的)解决方案。
【讨论】:
【参考方案3】:public class MyContext : DbContext
private string _connectionString get; set;
public MyContext(string connectionString) //Inject external connectionstring.
_connectionString = connectionString;
public MyContext(DbContextOptionsBuilder options) : base(options.Options) //Default binding from web.config.
protected override void OnModelCreating(ModelBuilder modelBuilder)
if (!optionsBuilder.IsConfigured && false == string.IsNullOrEmpty(_connectionString)) // if no default binding
optionsBuilder.UseSqlServer(_connectionString); //Use provider as SQL server and make connection through connection string.
optionsBuilder.UseLoggerFactory(_factory);//optional, Use Logger factory
base.OnConfiguring(optionsBuilder); //configure connection
【讨论】:
即使是不言自明的代码,你能评论一下吗?:)【参考方案4】:EF7 具有从 DBContextOptionsBuilder 到 EntityOptionsBuilder 的新语法。以下也可以用于命令行脚手架。
public class ContentContext : DbContext
public DbSet<Content> Contents get; set;
public DbSet<ContentCategory> ContentCategories get; set;
protected override void OnConfiguring(EntityOptionsBuilder optionsBuilder)
optionsBuilder.UseSqlServer("Data:DefaultConnection:ConnectionString");
【讨论】:
以上是关于在 Startup.cs 中添加 DbContextOptions 未注册数据存储的主要内容,如果未能解决你的问题,请参考以下文章
如何在 .NET 5 隔离进程中使用 Azure Functions v3 时添加以前在 Startup.cs 中的代码->配置方法
ASP .NET MVC 5 中使用的 Startup.Auth.cs 和 Startup.cs 是啥?