Add-Migration ef core 2 preview 1时出错

时间:2017-06-20 18:14:00

标签: c# entity-framework-core

我正在尝试在ef核心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; }
}

3 个答案:

答案 0 :(得分:2)

我建议实施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工具。

答案 1 :(得分:0)

将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”

答案 2 :(得分:0)

嗯,问题非常明确:

  

未找到无参数构造函数

所以,你需要这个:

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