.NET迁移报错:MovieCategory需定义主键或配置无键实体
问题场景
开发C# (.NET)项目时执行add-migration initial命令触发错误,项目构建成功但迁移操作失败。
相关代码
AppDBContext.cs
protected override void OnModelCreating(ModelBuilder modelBuilder) { object value = modelBuilder.Entity<Actor_Movie>().HasKey(am => new { am.ActorId, am.MovieId, } ); modelBuilder.Entity<Actor_Movie>().HasOne(m => m.Movie).WithMany(am => am.Actors_Movies).HasForeignKey(m => m.MovieId); modelBuilder.Entity<Actor_Movie>().HasOne(m => m.Actor).WithMany(am => am.Actors_Movies).HasForeignKey(m => m.ActorId); base.OnModelCreating(modelBuilder); }
MovieCategory.cs
namespace eTickets.Data.Enums; public class MovieCategory { }
错误信息
PM> add-migration initial
Build started...
Build succeeded.
System.InvalidOperationException: The entity type 'MovieCategory' requires a primary key to be defined. If you intended to use a keyless entity type, call 'HasNoKey' in 'OnModelCreating'.
at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidateNonNullPrimaryKeys(IModel model, IDiagnosticsLogger1 logger) at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.Validate(IModel model, IDiagnosticsLogger1 logger)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
The entity type 'MovieCategory' requires a primary key to be defined. If you intended to use a keyless entity type, call 'HasNoKey' in 'OnModelCreating'.
问题根源
EF Core要求所有被上下文追踪的实体类型必须定义主键(除非显式标记为无键实体)。你的MovieCategory类是一个空类,既没有属性也没有主键,且该类被EF Core上下文扫描识别为需要管理的实体,导致迁移阶段触发验证错误。
解决方案
根据实际使用场景选择以下方案之一:
方案1:为MovieCategory添加主键
如果MovieCategory是需要持久化到数据库的实体,添加主键属性(EF Core会自动识别命名为Id的属性为主键),示例:
namespace eTickets.Data.Enums; public class MovieCategory { public int Id { get; set; } // 可按需添加其他业务属性,比如分类名称 public string Name { get; set; } }
方案2:标记MovieCategory为无键实体
如果MovieCategory仅作为查询结果载体或不需要持久化,在OnModelCreating中标记它为无键实体:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 保留现有Actor_Movie配置 modelBuilder.Entity<Actor_Movie>().HasKey(am => new { am.ActorId, am.MovieId }); modelBuilder.Entity<Actor_Movie>().HasOne(m => m.Movie).WithMany(am => am.Actors_Movies).HasForeignKey(m => m.MovieId); modelBuilder.Entity<Actor_Movie>().HasOne(m => m.Actor).WithMany(am => am.Actors_Movies).HasForeignKey(m => m.ActorId); // 添加无键实体标记 modelBuilder.Entity<MovieCategory>().HasNoKey(); base.OnModelCreating(modelBuilder); }
方案3:从EF Core上下文中移除MovieCategory
如果MovieCategory根本不需要被EF Core管理,检查你的DbContext类,确保没有添加DbSet<MovieCategory>或相关配置项。
内容的提问来源于stack exchange,提问作者Saad Zahid Qureshi

