Entity framework core 在EF Core中的运行时上创建表
我知道我可以使用以下命令添加新迁移并创建数据库:Entity framework core 在EF Core中的运行时上创建表,entity-framework-core,Entity Framework Core,我知道我可以使用以下命令添加新迁移并创建数据库: dotnet ef migrations add MigrationName -c DbContextName dotnet ef database update -c DbContextName 但我需要在运行时创建数据库/表 首先,我试图通过重写ModelCreating来实现这一点,但失败了。它返回了一个错误,指出表尚未创建 这是我的dbcontext类 public class AimeLoggerContext : DbContext
dotnet ef migrations add MigrationName -c DbContextName
dotnet ef database update -c DbContextName
但我需要在运行时创建数据库/表
首先,我试图通过重写ModelCreating来实现这一点,但失败了。它返回了一个错误,指出表尚未创建
这是我的dbcontext类
public class AimeLoggerContext : DbContext
{
public AimeLoggerContext(DbContextOptions<AimeLoggerContext> options)
: base(options)
{
Database.Migrate();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity("Aime.Logger.Loggers.Database.Model.Log", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<DateTime>("Datetime");
b.HasKey("Id");
b.ToTable("Logs");
});
base.OnModelCreating(modelBuilder);
}
public DbSet<Log> Logs { get; set; }
}
public类AimeLoggerContext:DbContext
{
公共AimeLoggerContext(DbContextOptions选项)
:基本(选项)
{
Database.Migrate();
}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
基本配置(选项生成器);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
实体(“Aime.Logger.Logger.Database.Model.Log”,b=>
{
b、 财产(“Id”)
.ValueGeneratedOnAdd();
b、 财产(“日期时间”);
b、 HasKey(“Id”);
b、 可折叠(“原木”);
});
基于模型创建(modelBuilder);
}
公共数据库集日志{get;set;}
}
而不是DbContext.Database.Migrate()
我应该使用DbContext.Database.EnsureCreated()
方法。如果需要创建模型表,也可以在数据库中使用其他一些表
RelationalDatabaseCreator databaseCreator =
(RelationalDatabaseCreator) context.Database.GetService<IDatabaseCreator>();
databaseCreator.CreateTables();
RelationalDatabaseCreator databaseCreator=
(RelationalDatabaseCreator)context.Database.GetService();
databaseCreator.CreateTables();
在我潜入之前
如果您真的想正确地执行操作,那么您可能应该使用Migrate()而不是recreated(),因为后者意味着如果您想进行迁移,那么您将遇到问题
事实上,您希望在运行应用程序时创建数据库和表,这意味着您可能更倾向于迁移脚本和工作流中的代码优先方法,而不是使用数据库优先类型方法的数据库脚本
所以我假设
- 您希望使用代码优先的方法
- 您想使用EF核心迁移
- 您希望这些迁移在启动应用程序时自动发生
- 你想用正确的方法做这件事李>
useSqlServer
或UseNpgsql
或类似的细微差别
在努力阅读有关StackOverflow的各种文章之后,这些文章只是最大图片的一小部分,我最终设法让它工作得很好,正常,也许还很优雅
我做了一些事情,但我不完全确定到底是哪件事情让它起作用,但我相信这个列表是足够小的,可以得到满意的答案
这就是我所做的
dotnet工具安装--global dotnet ef
dotnet ef迁移添加InitialCreate--project。\DilaRepository\DilaRepository.csproj
- 控制台抱怨说
public void配置服务(IServiceCollection服务)
{
...
services.AddEntityFrameworkNpgsql().AddDbContext(opt=>
opt.UseNpgsql(
Configuration.GetConnectionString(“DefaultConnection”),
b=>b.MigrationsAssembly(“DilaAPI”)
));
MigrationAssembly在我读过的任何文章中都没有显示,在这里我使用的是它执行的程序集的名称,所以它自己无法理解这一点似乎有点奇怪,所以可能我要求它是做错了什么。我相信运行add migration initial时收到的一条错误消息告诉我需要它从那以后,它就开始起作用了
**将此连接字符串添加到appsettings.json(其中包含在运行时读取的正确连接字符串,因为可以有多个连接字符串(例如appsettings.Development.json),这一点非常重要**
在命令提示符下运行add migration
命令时,这将是必需的。这在我的WebAPI应用程序中创建了一个迁移文件夹,其中包含一些用于迁移的内容,但是这没有在我的数据库上执行。我不确定是否确实应该执行,但我将解释我最终是如何让它执行该命令的在我的数据库里
执行以下命令以生成迁移内容
添加迁移初始值
如果它不起作用,你会遇到一些错误,这里有些东西你可以试试
我们的目标项目“DilaAPI”与您的迁移程序集“DilaRepository”不匹配。请更改您的目标项目或更改您的迁移
Install-Package Microsoft.EntityFrameworkCore.Tools
Update-Package Microsoft.EntityFrameworkCore.Tools