我正在尝试在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; }
}
答案 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; }
}