我的问题是以下代码在启动期间没有注册数据存储。这是具体的错误"声明我得到了应用程序的回复:
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方式。
如果需要更多信息,我会提供。
答案 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");
}
}