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
相关产品推荐
相关产品推荐

