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

EF Core查询带复合主键的MSSQL表时所有返回行均为第一行值问题

问题根因

你遇到的现象是EF Core的身份映射机制导致的:EF Core会基于实体主键追踪实例,若查询返回的新行对应的主键值已经被当前上下文追踪,就会直接复用已有的实体实例,不会用新的行数据更新实例内容。
你当前未正确配置OrdDocLn表的复合主键,仅将OrdDocNo识别为唯一主键,因此所有OrdDocNo == 1333的行都会被判定为同一个实体,最终返回的集合虽然条目数量正确,但所有实例都是第一行的引用,字段值完全相同。

解决方案

EF Core配置复合主键有两种常用方式,二选一即可:

方法1:Fluent API配置(推荐)

在VismaContext的OnModelCreating方法中添加如下配置即可:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 配置OrdDocLn的复合主键
    modelBuilder.Entity<OrdDocLn>()
        .HasKey(e => new { e.OrdDocNo, e.DocLnNo });
    
    // 原有其他配置保持不变
}

该方式不侵入实体类代码,后续调整约束更灵活。

方法2:数据注解配置

直接在OrdDocLn实体类的对应字段上添加标记:

public class OrdDocLn
{
    [Key]
    [Column(Order = 0)]
    public int OrdDocNo { get; set; }
    
    [Key]
    [Column(Order = 1)]
    public int DocLnNo { get; set; }
    
    // 其他原有属性保持不变
}

配置完成后重新运行代码,即可得到和SQL查询完全一致的结果。如果是Code First开发模式,可生成新的迁移确认主键配置生效;Database First模式无需额外操作,直接运行即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:06:03