实体类型需定义主键错误:VS2017 MVC项目迁移报错求助
嘿,这个问题我之前也踩过坑!EF Core对实体主键的要求特别严格,每个实体都得有明确的主键,它才能正确映射到数据库表。咱们一步步来解决:
问题根源
你遇到的The entity type 'Transaction' requires a primary key to be defined错误,本质是你的Transaction实体类没有定义符合EF Core规则的主键——EF默认会识别名为Id或者[实体名]Id(比如TransactionId)的属性作为主键,要是你的类里没有这类属性,也没手动标记主键,就会报这个错。
另外还要提个小坑:你代码里引用了System.Transactions,但你的实体类也叫Transaction,这会导致命名冲突!建议要么把实体类改名(比如叫TransactionRecord),要么删掉using System.Transactions;这个引用(除非你真的需要用这个命名空间里的工具),不然后续很容易搞混。
三种解决办法,选你顺手的来
方法1:用EF默认约定添加主键
直接在Transaction类里加一个符合命名规则的属性,EF会自动把它识别为主键:
public class Transaction { // 两种命名都可以被EF自动识别为主键 public int Id { get; set; } // 或者 public int TransactionId { get; set; } // 你的其他业务属性,比如: public decimal Amount { get; set; } public DateTime TransactionTime { get; set; } // ... 其他字段 }
方法2:用DataAnnotations手动标记主键
如果你的主键字段名不是Id/TransactionId(比如叫SerialNumber),可以用[Key]特性来标记它,记得先引用对应的命名空间:
using System.ComponentModel.DataAnnotations; public class Transaction { [Key] public int SerialNumber { get; set; } // 其他业务属性... }
方法3:用Fluent API在DbContext里配置主键
要是不想在实体类里加特性,也可以在ApplicationDbContext的OnModelCreating方法里显式配置主键:
using Microsoft.EntityFrameworkCore; public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } // 务必确保注册了Transaction的DbSet,不然EF找不到这个实体 public DbSet<Transaction> Transactions { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 把YourKeyProperty替换成你实际的主键属性名 modelBuilder.Entity<Transaction>() .HasKey(t => t.YourKeyProperty); } }
改完之后,重新运行Add-Migration AddsTransactions命令,应该就能正常生成迁移文件啦!
内容的提问来源于stack exchange,提问作者Scott Pantall




