Entity Framework Core:外键和引用表 Id 列不匹配

Posted

技术标签:

【中文标题】Entity Framework Core:外键和引用表 Id 列不匹配【英文标题】:Entity Framework Core: foreign key and reference table Id column do not match 【发布时间】:2021-12-01 09:02:50 【问题描述】:

我目前正在使用 EF Core 5 进行开发。我有一个现有的数据库,因此更改列可能不是一个好的选择。

例如我有两个表:

public class CalssA

    public long AId  get; set; 
    public long TheBId  get; set; 
    [Foreign("TheBId")]
    public virtual ClassB B  get; set; 


public class ClassB

    public long BId  get; set; 

    [InverseProperty(nameof(CalssA.B))]
    public virtual ICollection<ClassA> Aas get;set;

当我尝试用 B 获取 A 数据时,似乎 B 信息未加入 A。

var a = _AContext.As.Include(a => a.B).FirstOrDefault();
var b = a.B // get null

是加入问题吗?我应该如何指定要加入 EF Core 的列?

谢谢

【问题讨论】:

【参考方案1】:

你必须添加导航属性


public class ClassA
  
    [Key]
    public long AId  get; set; 

    public long? TheBId  get; set; 
    [ForeignKey( nameOf(TheBId))]
    [InverseProperty(nameOf(ClassB.Aas))] 
    public virtual ClassB B  get; set; 

public class ClassB

    [Key]
    public long BId  get; set; 
    
  
      [InverseProperty(nameof(ClassA.B))]
    public virtual ICollection<ClassA>  Aas get; set; //one-to-many

你可以尝试添加到dbcontext

modelBuilder.Entity<ClassA>(entity =>
            
                entity.HasOne(d => d.B)
                   .WithMany(p => p.Aas)
                   .HasForeignKey(d => d.TheBId);
                  
            );

【讨论】:

感谢您的回答,我尝试了您的方法,但属性 B 仍然为空。我使用[InverseProperty(nameof(A.B))] public virtual ICollection&lt;A&gt; Aas get; set;[InverseProperty("Aas")] @jamesaq12wsx 它应该可以工作。因为它是一个简单的基本配置。恐怕您将不得不删除数据库的迁移文件夹和迁移表。在此之后,您将重复初始迁移到数据库,并且只有在此之后再试一次 嗨@Serge,我这次没有使用ef core的迁移功能,因为数据库已经存在了。 @jamesaq12wsx 一切正常,您只是忘记将 [InverseProperty(nameOf(ClassB.Aas))] 添加到 ClassA 是的,一切都应该和我现在的回答一样。只有 [ForeignKey( nameOf(BId))] 不正确。应该是 [ForeignKey(nameOf(TheBId))]

以上是关于Entity Framework Core:外键和引用表 Id 列不匹配的主要内容,如果未能解决你的问题,请参考以下文章

一列用于 Entity Framework Core 中两个不同表的外键

在 Entity Framework Core 中重命名外键而不删除数据

Entity Framework Core 实体关系的配置

Entity Framework Core 实体关系的配置

Entity Framework Core fluent api一对多和一对一产生重复的外键

如何在 Entity Framework Core 2 中播种?