c# - 使用 ef 代码迁移 dotnetcore 或 packge manager 控制台创建数据库
问题描述
我想基于现有的 ef dotnet core web mvc 项目在本地 sql server 实例上创建数据库。为了实现这一点,我遵循两种方法。一种是使用包管理器控制台。
当我运行更新数据库时使用包管理器控制台它给了我以下错误
Value cannot be null. (Parameter 'connectionString') at Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty(String value, String parameterName) update database
我的 appsettings 具有以下结构
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"ConnectionStrings": {
"MyDatabase": "Server=localhost\\SQLEXPRESS;Database=mydevdb;Trusted_Connection=True;"
},
}
经过一些研究,我觉得它可能正在寻找应用程序设置的结构
connectionStrings -> DefaultConnection
如果我想保留我现有的应用程序设置来创建这个数据库,可以使用包管理器控制台。
当我进行更多研究时,我发现还有第二种方法是使用dbcontext.Database.migrate()
方法。所以我将我的代码更新到下面以使其工作
// CreateWebHostBuilder(args).Build().Run(); //old code
CreateHostBuilder(args).Build().MigrateDatabase().Run();
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
我有以下迁移管理器课程
public static class MigrationManager
{
public static IHost MigrateDatabase(this IHost host)
{
using (var scope = host.Services.CreateScope())
{
using (var appContext = scope.ServiceProvider.GetRequiredService<DataContext>())
{
try
{
appContext.Database.Migrate();
}
catch (Exception ex)
{
//Log errors or do anything you think it's needed
throw;
}
}
}
return host;
}
虽然上面的代码有效,但它仅在我使用CreateHostBuilder
而不是CreateWebHostBuilder
. 这两者有什么区别,我应该使用哪一个?我希望这只在不存在时创建数据库。是否建议使用包管理器控制台来创建本地数据库或使用上述基于代码的方法?
解决方案
推荐阅读
- python - 如何将python脚本编译为无需shell即可打开的独立可执行Windows文件
- ruby-on-rails - 使用 When Gem 调用活动作业
- java - 用于列表目的的 Android 最有效容器
- c# - 数据表不一致
- javascript - 为什么用 ES5 表达的带有 set 关键字和函数的 setter 会抛出语法错误?
- python - 当多个元素具有最高计数时,pandas describe() - top 如何工作?
- twitter-bootstrap - 仅包含一个模块的引导样式
- javascript - 我想在动画图标上重复鼠标悬停功能
- charts - 如何为时间序列线谷歌颤动图添加标签?
- ip - 什么是 32 位地址空间