add-Migration 错误没有为此 DbContext 配置数据库提供程序

Posted

技术标签:

【中文标题】add-Migration 错误没有为此 DbContext 配置数据库提供程序【英文标题】:add-Migration Error No database provider has been configured for this DbContext 【发布时间】:2019-03-25 16:57:50 【问题描述】:

我正在尝试将迁移添加到 DbContext ,

add-migration initial -verbose

我得到错误

没有为此 DbContext 配置数据库提供程序。一种 可以通过覆盖 DbContext.OnConfiguring 来配置提供程序 方法或通过在应用程序服务提供者上使用 AddDbContext。 如果使用了 AddDbContext,那么还要确保你的 DbContext 类型 在其构造函数中接受一个 DbContextOptions 对象,并且 将其传递给 DbContext 的基本构造函数。

我的解决方案中有两个 .netcore 类库项目和 ,netcore 单元测试项目

    域(Poco Classess) 存储库(.Net Core 2.1,EntitiFrameworkCore 2.1.4) 存储库测试

这是我的 DataContext 类

 public class DataContext:DbContext
    
        public DataContext(DbContextOptions<DataContext> option) : base(option)
        

        

        public DataContext()
        

        

    public DbSet<User> User  get; set; 
    public DbSet<Cart> Cart  get; set; 
    public DbSet<CatalogItem> CatalogItem  get; set; 
 

带有 DbContextOptions 对象的构造函数已经存在。

可能是什么问题?

这是测试项目中的一个类。

 public class CustomerRepositoryIntegrationTest
    
        [Fact]
        public void should_add_customer()
        
            //Arrange
            var option = new DbContextOptionsBuilder<DataContext>()
            .UseSqlServer(@"Data Source=(LocalDb)\MSSQLLocalDB;Database=ecommerce;Integrated Security=SSPI").Options;

            //Act
            using (DataContext dataConext = new DataContext(option))
            

                dataConext.Database.Migrate();
                customer actual = new Customer()
                dataConext.Customer.Add(actual);
                dataConext.SaveChanges();

                var expected = dataConext.Customer.FirstOrDefault();

                //Assert
                expected.Should().BeEquivalentTo(expected);
            


            //Assert
        
    

【问题讨论】:

好吧,您似乎没有像错误消息告诉您的那样配置 DbContext。你的上下文配置在哪里? @CamiloTerevinto 它在我的测试项目中。我只是更新代码 问题到底有什么问题?你为什么投反对票? add-migration 命令不知道您的单元测试,因此对于该命令,您还没有配置上下文。解决此问题的最简单方法是覆盖 OnConfiguring 并配置上下文(如果尚未发生)(就像在您的测试中发生的那样) @CamiloTerevinto 我应该在我的测试项目中这样做吗? 【参考方案1】:

在测试项目中创建一个实现IDesignTimeDbContextFactory的类,并将测试项目设置为启动项目

public class TemporaryDataContextFactory : IDesignTimeDbContextFactory<DataContext>

    public DataContext CreateDbContext(string[] args)
    
        var option = new DbContextOptionsBuilder<DataContext>()
        .UseSqlServer(@"Data Source=(LocalDb)\MSSQLLocalDB;Database=IbReport;Integrated Security=SSPI").Options;
        return new DataContext(option);
    

【讨论】:

太棒了!比使用一次性控制台应用程序要好得多。在 .net core 中,我从我的上下文项目目录中运行了dotnet ef migrations add InitialCreate --startup-project &lt;myTestProject&gt;,一切运行良好。非常感谢。

以上是关于add-Migration 错误没有为此 DbContext 配置数据库提供程序的主要内容,如果未能解决你的问题,请参考以下文章

EF Core 迁移错误:PositionalParameterNotFound,Add-Migration

为啥 ef Add-Migration 出现错误

EF Core Add-Migration 错误属性已存在

在Add-Migration时出现类似错误时,看看默认启动项目是不是不是web,而是类库

实体框架迁移错误 - 序列不包含任何元素

add-migration:无法将参数绑定到参数“路径”,因为它是一个空字符串