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<A> 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 中重命名外键而不删除数据