在Startup.cs中添加DbContextOptions未注册数据存储。

11

我的问题是以下代码在启动时无法注册数据存储。这是应用程序响应中我得到的具体“错误”声明:

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方式。

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


是的,在beta 4中Lambda方式似乎无法正常工作,当我尝试执行迁移时也遇到了同样的问题。 - Ron DeFreitas
@RonDeFreitas 是的,我目前正在使用beta3版本,但我想我只需要等待他们修复它,只是觉得在github上的EF 7以lambda方式作为设置DbContextOptions的示例很奇怪。顺便说一句,很高兴知道我在这个问题上不是孤单的。 - DanielRJ
4个回答

5

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


我正在注入我的 DbContext。所以,这不是令人遗憾的。 - DanielRJ
奇怪...这是我在beta4上的情境,它运行良好 services.AddEntityFramework() .AddSqlServer() .AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])); - Chris Woolum
谢谢分享,我明天会试一下。如果不麻烦的话,我也打算升级到beta4。我从beta2开始使用,2和3之间的升级很痛苦。在Microsoft.MVC中进行迁移和类重命名并不好玩。我明天会告诉你结果的。 - DanielRJ
从3到4的迁移也相当棘手。 - Chris Woolum
我在beta3中尝试了你的示例代码,但在我的项目中无法工作,仍然出现相同的错误。在config.json中,名称与你的相同。我决定使用一个静态类,在启动时读取配置文件,并且当我的DbContext需要该信息时,它们将向静态类请求。我有一个项目结构,其中将dbcontext与我的repositories分开到自己的项目中。谢谢你!不过我不会迁移到beta4,因为项目明天就要交了。 - DanielRJ

1

我在使用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中的任何内容(那里的一切都像你描述的那样)。一旦解决了这个问题,您只需从数据上下文类中删除相关内容即可。 也许有人对这个问题有另一个(甚至更好的)解决方案。

1
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

    }
}

即使代码已经很明显了,您能否对其进行评论? :) - Andronicus

-1

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");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接