在 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 中的代码->配置方法

在 .NET 6 项目中使用 Startup.cs

ASP .NET MVC 5 中使用的 Startup.Auth.cs 和 Startup.cs 是啥?

在 .NET 6 中使用 Startup.cs 更简洁的方法

从 startup.cs 检查令牌有效性

在 Startup.cs 中初始化 Blob 存储