实体框架7未配置数据库提供程序=>;当迁移移动到另一个项目时
本文关键字:迁移 gt 移动 项目 另一个 框架 配置 数据库 程序 实体 | 更新日期: 2023-09-27 18:23:48
我是EF7的新手。我知道这是一个重复的问题:
没有配置数据库提供程序EF7
但是,在你想结束这个问题之前,请等待。。。并在上读取
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddScoped<TestRepository, TestRepository>();
现在,我在ef项目的cmd窗口上运行dnx-ef数据库更新命令,并得到以下错误:
C:'TGB.DataAccess>dnx ef database update
System.InvalidOperationException: No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services.
bei Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices(ServiceProviderSource providerSource)
bei Microsoft.Data.Entity.Internal.DbContextServices.<>c__DisplayClass6_0.<Initialize>b__0()
bei Microsoft.Data.Entity.Internal.LazyRef`1.get_Value()
bei Microsoft.Data.Entity.Internal.DbContextServices.get_DatabaseProviderServices()
bei Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.<>c.<AddEntityFramework>b__0_8(IServiceProvider p)
bei Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryService.Invoke(ServiceProvider provider)
bei Microsoft.Extensions.DependencyInjection.ServiceProvider.ScopedCallSite.Invoke(ServiceProvider provider)
bei Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass12_0.<RealizeService>b__0(ServiceProvider provider)
bei Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
bei Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
bei Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService[T](IServiceProvider provider)
bei Microsoft.Data.Entity.Design.Internal.DesignTimeServicesBuilder.Build(DbContext context)
bei Microsoft.Data.Entity.Design.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
bei Microsoft.Data.Entity.Commands.Program.Executor.<>c__DisplayClass7_0.<UpdateDatabase>b__0()
bei Microsoft.Data.Entity.Commands.Program.Executor.Execute(Action action)
No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services.
现在,我试图根据我粘贴在顶部的解决方案链接更改ApplicationDbContext
的构造函数:
这是我的代码:
我的ApplicationDbContext.cs实际上是空的,这意味着我没有覆盖任何内容
看看基类的基类,有一个重载的构造函数,参数为DbContextOptions,但我不能从我的构造函数传递任何东西?!
//
// Summary:
// Initializes a new instance of Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext.
//
// Parameters:
// options:
// The options to be used by a Microsoft.Data.Entity.DbContext.
public IdentityDbContext(DbContextOptions options);
我这边坏了什么?我使用的是EF 7 RC1和dnx 451。
只有当您将ApplicationDbContext/ApplicationUser和整个Migrations文件夹移动到一个额外的项目(比如"DataAccess"项目)时,才会发生这种情况。然后一切似乎都坏了
-
使用Web应用程序模板(身份验证:个人用户帐户)创建名为"WebProject"的新ASP.NET Web应用程序。
-
现在将另一个项目添加到名为"DataAccess"的解决方案中(比如类库类型,尽管它不相关)
-
现在移动ApplicationDbContext/ApplicationUser文件&迁移文件夹到DataAccess项目。
-
在这个阶段,构建将失败,因此我们需要更正project.json以获得正确的引用。
-
对于DataAccess项目,添加以下依赖项
"dependencies": { "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final", "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final" }
-
对于WebProject,添加
DataAccess
作为依赖项。由于DataAccess
引用了以上两个包,您可以从WebProject中删除这些引用
构建现在应该成功,您可以启动web应用程序。
如何使用ef迁移:
在命令行中,转到WebProject的目录(而不是DataAccess项目)。从这里开始,所有ef命令都可以正常工作。
要将新迁移添加到DataAccess项目的migrations文件夹,需要使用-p
标志。比如,dnx ef migrations add Sample -p DataAccess
。
出现此问题是因为命令是从DataAccess项目中的cmd运行的。正在初始化所有服务的启动类位于WebProject中。当您尝试从DataAccess目录运行命令时,dnx ef
将被识别,因为EntityFramework.Commands
被引用,但当您尝试使用迁移时,服务未初始化,因此将无法引发上述异常。
尝试将您的Context类移动到您的"DataAccess"项目中,并在您的"数据访问"项目中覆盖Context的OnConfiguring方法,然后运行迁移。
public partial class MyContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseSqlServer(@"Server=****;Database=***;user id=***;password=***");
}
}
或者,如果你不想硬编码你的连接字符串,你可以做如下操作。DI将为您注入选项;
public partial class MyContext : DbContext
{
public MyContext(DbContextOptions<MyContext> options) : base(options)
{
}
}
以及您的Startup.cs;
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
}
public void ConfigureServices(IServiceCollection services)
{
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<WtContext>(options =>
options.UseSqlServer(Configuration["Data:MyDb:ConnectionString"]));
}
以及您的appsetting.json;
{
"Data": {
"MyDb": {
"ConnectionString": "**********"
}
}
}