You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

实体类型需定义主键错误: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里配置主键

要是不想在实体类里加特性,也可以在ApplicationDbContextOnModelCreating方法里显式配置主键:

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

火山引擎 最新活动