You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core执行迁移更新后数据库未生成表的问题求助

问题:EF Core迁移后数据库未生成表,种子数据无效

我正在做大学项目,需要从数据库提取数据并通过REST控制器返回。现在遇到的问题是:执行首次迁移并更新数据库后,数据库里没生成对应的表,填充种子数据也没效果。


代码文件

DatabaseAccess.cs(继承DbContext的类)

using Domain.Models;
using Microsoft.EntityFrameworkCore;

namespace EntityDataAccess;

public class DatabaseAccess : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=../EntityDataAccess/sep3db.db");
        base.OnConfiguring(optionsBuilder);
    }

    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        
        modelBuilder.Entity<User>().HasData(
            new User
            {
                Id = 1,
                Email = "alex@gmail.com",
                Password = "1234",
                Role = "Admin",
                Username = "Alex"
            }
        );
        
        // Constraints, Primary keys, Foreign keys, etc.
        modelBuilder.Entity<User>().HasKey(user => user.Id);
        modelBuilder.Entity<User>().Property(user => user.Id).ValueGeneratedOnAdd();
        
        modelBuilder.Entity<Recipe>().HasKey(recipe => recipe.Id);
        modelBuilder.Entity<Recipe>().Property(recipe => recipe.Id).ValueGeneratedOnAdd();
    }
    
    public DbSet<User> Users { get; set; }

    public DbSet<Recipe> Recipes { get; set; }
    public DbSet<Ingredient> Ingredients { get; set; }
    public DbSet<Description> Descriptions { get; set; }
    public DbSet<Rating> Ratings { get; set; }

}

User.cs(模型类)

using System.ComponentModel.DataAnnotations;
namespace Domain.Models;

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }  
    public string Email { get; set; }
    public string Role { get; set; }
}

Program.cs

using EntityDataAccess;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();


builder.Services.AddDbContext<DatabaseAccess>();


var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

补充说明

最初尝试用PostgreSQL,连接字符串为"Host=localhost; Port=5432; Database=sep3db; Username=postgres; Password=postgres;",同样出现表未生成的问题,改用SQLite测试后问题依旧。

已尝试的操作

  • 执行迁移并更新数据库
  • 用Rider的数据库工具刷新数据库
  • 给User模型添加/移除构造函数
  • 移除除Users外的其他DbSet
  • 用SQLite数据库浏览器检查,表仍未生成

可能的问题点及解决办法

  1. 迁移命令执行不完整

    • 确保在包管理器控制台或终端执行正确命令:
      • 生成迁移:Add-Migration InitialCreate(包管理器控制台)或dotnet ef migrations add InitialCreate(终端)
      • 更新数据库:Update-Database(包管理器控制台)或dotnet ef database update(终端)
    • 注意终端命令要在包含DbContext的项目目录下执行,包管理器控制台要选对默认项目。
  2. SQLite连接字符串路径错误

    • 相对路径可能导致数据库文件生成在错误位置,改用项目根目录路径:
      optionsBuilder.UseSqlite("Data Source=sep3db.db");
      
      文件会生成在项目输出目录(如bin/Debug/netX.x),方便查找验证。
  3. 种子数据配置顺序错误

    • 先调用HasData再配置主键会导致冲突,需调整顺序:先配置实体主键和属性,再添加种子数据:
      protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
          base.OnModelCreating(modelBuilder);
          
          // 先配置主键与属性
          modelBuilder.Entity<User>().HasKey(user => user.Id);
          modelBuilder.Entity<User>().Property(user => user.Id).ValueGeneratedOnAdd();
          
          modelBuilder.Entity<Recipe>().HasKey(recipe => recipe.Id);
          modelBuilder.Entity<Recipe>().Property(recipe => recipe.Id).ValueGeneratedOnAdd();
          
          // 再添加种子数据
          modelBuilder.Entity<User>().HasData(
              new User
              {
                  Id = 1,
                  Email = "alex@gmail.com",
                  Password = "1234",
                  Role = "Admin",
                  Username = "Alex"
              }
          );
      }
      
  4. DbContext注册未显式指定配置

    • 在Program.cs中注册DbContext时显式指定数据库提供程序,避免配置被覆盖:
      builder.Services.AddDbContext<DatabaseAccess>(options =>
          options.UseSqlite("Data Source=sep3db.db"));
      
  5. 检查迁移文件有效性

    • 查看项目中的Migrations文件夹,确认迁移文件包含创建表的代码。若文件为空或内容错误,删除现有迁移后重新生成。

学习资源

  • EF Core官方文档:重点学习迁移、DbContext配置、种子数据章节
  • ASP.NET Core + EF Core入门教程:从基础配置到REST API开发的完整流程
  • 实体框架核心实战:通过案例掌握模型配置、迁移和数据操作的最佳实践

内容的提问来源于stack exchange,提问作者alexcimpan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:50:24