【问题标题】:Error while Add-Migration ef core 2 preview 1Add-Migration ef core 2 preview 1 时出错
【发布时间】:2017-11-23 10:11:06
【问题描述】:

我正在尝试在 ef core 2 上做一个示例,但是当我尝试添加迁移时得到以下结果

PM> Add-Migration InitialCreate
No parameterless constructor was found on 'ToDoContext'. Either add a parameterless constructor to 'ToDoContext' or add an implementation of 'IDbContextFactory<ToDoContext>' in the same assembly as 'ToDoContext'.

我遵循了本教程https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/new-db 这是我的代码。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        var connection = @"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.AspNetCore.NewDb;Trusted_Connection=True;";
        services.AddDbContext<ToDoContext>(options => options.UseSqlServer(connection));
        services.AddMvc();
    }
}

public class ToDoContext : DbContext
{
    public ToDoContext(DbContextOptions<ToDoContext> options)
        : base(options)
    {

    }
    public DbSet<ToDo> ToDos { get; set; }
}

public class ToDo
{
    public int Id { get; set; }
    public string Title { get; set; }
    public bool Completed { get; set; }
}

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

    我建议实施IDbContextFactory。这是一个例子。

    class ToDoContextFactory : IDbContextFactory<ToDoContext>
    {
        public ToDoContext Create(DbContextFactoryOptions options)
        {
            var serviceCollection = new ServiceCollection()
                .AddLogging();
            new Startup().ConfigureServices(serviceCollection);
    
            var serviceProvider = serviceCollection.BuildServiceProvider();
    
            return serviceProvider.GetRequiredService<ToDoContext>();
        }
    }
    

    在 2.0 中,ASP.NET Core 团队更新了构建应用程序的推荐模式。这打破了 EF Core 工具访问应用程序服务提供者的方式。这导致我们删除了调用Startup.ConfigureService 的方式,并将其更新为调用Program.BuildWebHost。这意味着任何从 1.x 升级到 2.0 的应用都需要更新到新模式或实现 IDbContextFactory,然后才能使用 2.0 工具。

    【讨论】:

    【解决方案2】:

    嗯,问题很清楚了:

    没有找到无参数构造函数

    所以,你需要这个:

    public class ToDoContext : DbContext
    {
    
        public ToDoContext() // this is a parameterless (with no parameters) constructor 
        { }
    
        public ToDoContext(DbContextOptions<ToDoContext> options) : base(options)
        { }
    
        public DbSet<ToDo> ToDos { get; set; }
    }
    

    【讨论】:

    • 添加无参数构造函数给出一个新错误System.InvalidOperationException: No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions&lt;TContext&gt; object in its constructor and passes it to the base constructor for DbContext. at Microsoft.EntityFrameworkCore.Internal.DbContextServices`
    【解决方案3】:

    将 TDoContext 类构造函数更改为:

    public ToDoContext()
        : base("PUT_WEB_CONFIG_CONNECTION_STRING_NAME_HERE")
    {
    
    }
    

    PUT_WEB_CONFIG_CONNECTION_STRING_NAME_HERE 是连接字符串的 web.config 中的名称部分,web.config 的那部分类似于:

     <connectionStrings>
        <add name="DefaultConnection" ... />
      </connectionStrings>
    

    所以你会使用“DefaultConnection”

    【讨论】:

    • EF Core 没有支持字符串参数的构造函数
    • 是的,对不起,我错过了“核心”,所以我相信你的话
    猜你喜欢
    • 2021-12-29
    • 2021-12-28
    • 2019-11-15
    • 2015-07-20
    • 1970-01-01
    • 2016-11-04
    • 2020-07-14
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多