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核心迁移
  • 您希望这些迁移在启动应用程序时自动发生
  • 你想用正确的方法做这件事
我第一次做到了这一点(我的是Postgres,但我看到的MS Sql示例应该非常接近,它们非常相似,唯一的区别是
useSqlServer
UseNpgsql
或类似的细微差别

在努力阅读有关StackOverflow的各种文章之后,这些文章只是最大图片的一小部分,我最终设法让它工作得很好,正常,也许还很优雅

我做了一些事情,但我不完全确定到底是哪件事情让它起作用,但我相信这个列表是足够小的,可以得到满意的答案

这就是我所做的
  • 我通过以下方式确保安装了powershell Cli工具

  • 我在cmd.exe
    dotnet工具安装--global dotnet ef

  • 打开VS Package manager控制台,您可以通过在VS 2019顶部的搜索框中键入Package manager console来访问该控制台(

  • 在其中键入以下命令
  • 我的存储库代码与我的Web应用程序项目位于不同的项目中,因此我遇到了一些错误

    我尝试在我的存储库项目上运行EF Migrate命令,因为它在WebAPI项目中不起作用

    dotnet ef迁移添加InitialCreate--project。\DilaRepository\DilaRepository.csproj

    • 控制台抱怨说
    您的启动项目“DilaRepository”未引用Microsoft.EntityFrameworkCore.Design

    因此,我在收到这些消息的地方添加了nuget包,从而消除了这些错误。我不知道这是否是必需的,因为最后我在WebApi项目上使用了EF Migrate命令,该项目包含startup.cs和program.cs

    不过,我需要做的是让它工作起来

    在我的startup.cs中,我有这样一个(这相当于一个锅炉板,你会在所有文章中看到)

    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