注意 我已经阅读了大量看似相似的SO答案,但是我已经按照他们的建议去做,所以我没有知道WPF是否有区别(它们似乎都与ASP.NET有关)。另外,大多数答案都与运行时错误有关,而不是添加迁移时的错误。
我正在尝试建立一个使用EntityFrameWork Core的.NET Core 3 WPF项目,但是在添加迁移时遇到了问题。我将上下文设置如下...
public class ApplicationDbContext : DbContext {
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options) {
}
public ApplicationDbContext() {
}
public DbSet<Product> Products { get; set; }
}
无参数构造函数在那里,因为没有它,我会得到一个异常在尝试添加迁移时无法创建类型为'ApplicationDbContext'的对象。
我的App.xaml.cs
包含以下内容...
public partial class App {
public IServiceProvider ServiceProvider { get; private set; }
public IConfiguration Configuration { get; private set; }
protected override void OnStartup(StartupEventArgs e) {
IConfigurationBuilder builder = new ConfigurationBuilder()
.SetBasePath(Directory.getcurrentDirectory())
.AddJsonFile("appSettings.json",optional: false,reloadOnChange: true);
Configuration = builder.Build();
ServiceCollection serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
ServiceProvider = serviceCollection.BuildServiceProvider();
MainWindow mainWindow = ServiceProvider.GetRequiredService<MainWindow>();
mainWindow.Show();
}
private void ConfigureServices(IServiceCollection services) {
// Configuration
services.Configure<AppSettings>(Configuration.GetSection(nameof(AppSettings)));
// Database
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.getconnectionString("SqlConnection")));
// Windows
services.AddTransient(typeof(MainWindow));
}
}
我意识到其中的某些内容是无关紧要的,但我想我会向全班同学展示,以防万一它揭示了我错过的内容。该代码基于此blog post。
但是,当我尝试添加迁移时,出现异常“ 没有为此DbContext配置数据库提供程序。可以通过覆盖DbContext.Onconfiguring方法或在应用程序上使用AddDbContext来配置提供程序。服务提供者。如果使用AddDbContext,则还要确保您的DbContext类型在其构造函数中接受DbContextOptions对象,并将其传递给DbContext的基本构造函数。“
据我所知,我已经配置了数据库提供程序。我在ConfigureServices
方法中设置了一个断点,可以看到使用正确的连接字符串调用了services.AddDbContext
。
有人知道我错过了什么吗?
更新,我尝试连接到现有数据库,并且运行良好,因此看来数据库提供程序已正确配置。只有当我尝试添加迁移时,我才例外。
更新2 似乎迁移工具正在上下文中使用无参数构造函数,这就是为什么它认为尚未配置提供程序的原因。如果我从App.xaml.cs中删除对其进行配置的行,而改写Onconfiguring
方法来调用UseSqlServer
,则迁移可以正常进行。但是,除了我没有看到其他人这样做的事实(这使我想知道这是否真的是正确的方法)之外,我没有看到如何从配置文件中获取连接字符串。我无法注入IConfiguration
参数,因为整个问题是迁移需要无参数的构造函数。