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

时间:2015-04-29 13:32:02

标签: 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 in the AddDbContext method when setting up services.
    Microsoft.Data.Entity.Storage.DataStoreSelector.SelectDataStore(ServiceProviderSource providerSource)

在ConfigureServices(IServiceCollection服务)中,我试图在lambda中为我的DbContext指定DbContextOptions。代码:

services.AddEntityFramework(Configuration)
    .AddSqlServer()
    .AddDbContext<MyDbContext>(
        options =>
        options.UseSqlServer(Configuration.Get("Data:DefaultConnection:ConnectionString"))
    );

在我的DbContext中,我有一个构造函数,它将选项发送到base,代码:

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

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

3 个答案:

答案 0 :(得分: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);
    }
}

我从选项中提取connectionstring,并在OnConfiguring方法中使用它。这仍然不是我们想要的解决方案,但我不需要在Startup.cs中改变一些东西(就像你描述的那样)。并且一旦修复,您只需要从数据上下文类中删除这些东西。 也许某人有另一个(甚至更好)解决这个问题的方法。

答案 1 :(得分: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

    }
}

答案 2 :(得分:-1)

EF7具有从DBContextOptionsBuilder到EntityOptionsBuilder的新sytax。以下内容已准备好用于命令行脚手架。

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