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数据库浏览器检查,表仍未生成
可能的问题点及解决办法
迁移命令执行不完整
- 确保在包管理器控制台或终端执行正确命令:
- 生成迁移:
Add-Migration InitialCreate(包管理器控制台)或dotnet ef migrations add InitialCreate(终端) - 更新数据库:
Update-Database(包管理器控制台)或dotnet ef database update(终端)
- 生成迁移:
- 注意终端命令要在包含DbContext的项目目录下执行,包管理器控制台要选对默认项目。
- 确保在包管理器控制台或终端执行正确命令:
SQLite连接字符串路径错误
- 相对路径可能导致数据库文件生成在错误位置,改用项目根目录路径:
文件会生成在项目输出目录(如optionsBuilder.UseSqlite("Data Source=sep3db.db");bin/Debug/netX.x),方便查找验证。
- 相对路径可能导致数据库文件生成在错误位置,改用项目根目录路径:
种子数据配置顺序错误
- 先调用
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" } ); }
- 先调用
DbContext注册未显式指定配置
- 在Program.cs中注册DbContext时显式指定数据库提供程序,避免配置被覆盖:
builder.Services.AddDbContext<DatabaseAccess>(options => options.UseSqlite("Data Source=sep3db.db"));
- 在Program.cs中注册DbContext时显式指定数据库提供程序,避免配置被覆盖:
检查迁移文件有效性
- 查看项目中的Migrations文件夹,确认迁移文件包含创建表的代码。若文件为空或内容错误,删除现有迁移后重新生成。
学习资源
- EF Core官方文档:重点学习迁移、DbContext配置、种子数据章节
- ASP.NET Core + EF Core入门教程:从基础配置到REST API开发的完整流程
- 实体框架核心实战:通过案例掌握模型配置、迁移和数据操作的最佳实践
内容的提问来源于stack exchange,提问作者alexcimpan
相关产品推荐
相关产品推荐

