C# 在Startup.cs中添加DbContextOptions不注册数据存储

C# 在Startup.cs中添加DbContextOptions不注册数据存储,c#,entity-framework,dependency-injection,asp.net-core-mvc,entity-framework-core,C#,Entity Framework,Dependency Injection,Asp.net Core Mvc,Entity Framework Core,我的问题是,下面的代码在启动期间没有注册数据存储。这是我在应用程序的响应中得到的特定“错误”语句: 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 i

我的问题是,下面的代码在启动期间没有注册数据存储。这是我在应用程序的响应中得到的特定“错误”语句:

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"))
    );
启动时读取的配置文件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方法


如果需要更多信息,我会提供。

您是将上下文注入控制器还是在使用它的任何地方?我发现,如果您尝试重新创建上下文而不是注入上下文,它不会使用Startup中指定的配置。cs

I(仍然)与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);
    }
}
公共类AspNetDataContext:IdentityDbContext,IDataContext
{
私有只读字符串_connectionString;
公共DbSet播放器{get;set;}
公共AspNetDataContext(DbContextOptions)
{
_connectionString=((SqlServerOptionsExtension)options.Extensions.First()).connectionString;
}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
optionsBuilder.UseSqlServer(_connectionString);
}
}
我从选项中提取connectionstring,并在OnConfigurang方法中使用它。这仍然不是我们想要的解决方案,但我不必在Startup.cs中更改某些内容(所有内容都与您描述的一样)。一旦这个问题得到解决,您只需要从数据上下文类中删除这些内容。
也许有人有另一个(甚至更好的)解决方案来解决这个问题。

EF7将新的sytax从DbContextOptions Builder扩展到EntityOptions Builder。以下内容也可用于命令行脚手架

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");
    }
}
公共类ContentContext:DbContext
{
公共数据库集内容{get;set;}
公共DbSet ContentCategories{get;set;}
配置时受保护的覆盖无效(EntityOptions Builder Options Builder)
{
optionsBuilder.UseSqlServer(“数据:DefaultConnection:ConnectionString”);
}
}

是的,似乎Lambda方法在beta 4中无法正常工作,我在尝试执行时也遇到了同样的问题migrations@RonDeFreitas是的,我现在在beta3上,但我想我必须等到他们修复它,只是觉得奇怪的是github上的EF7以lambda方式作为如何设置DbContextOptions的示例。顺便说一句,很高兴知道在这件事上我不是一个人。我正在注入我的背景。所以,这并不是那么可悲。维尔德。。。这是我在beta4上的上下文,它运行良好。AddEntityFramework().AddSqlServer().AddDbContext(选项=>options.UseSqlServer(配置[“数据:默认连接:连接字符串]));谢谢分享,我明天就试试。如果不麻烦的话,我还打算升级到beta4。从beta2开始,升级在2到3之间是痛苦的。Microsoft.MVC中的迁移和类重命名,不好玩。明天我会让你知道它是如何进行的。从3->4的迁移也非常糟糕。我已经在beta3中尝试了你的示例代码,没有在我的项目中工作,仍然得到相同的错误。在config.json中,名称与您的名称相同。我决定使用一个静态类在启动时读取配置文件,当我的DbContexts需要这些信息时,他们会向静态类请求这些信息。我有一个项目结构,在这个结构中,我将dbcontext与我的存储库分离在它自己的项目中。谢谢你!我不会迁移到beta4,项目将于明天到期,所以,是的。你能对代码进行评论吗,即使它是不言自明的?:)
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");
    }
}
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

    }
}