EF Core 2一对一关系配置报错:Child实体需定义主键
解决EF Core 2中一对一关系Child主键/外键配置问题
这个问题我之前也碰到过,本质是EF Core没办法自动识别你想把ParentId作为Child的主键——毕竟它默认会找像Id或者ChildId这类命名的字段当主键,所以才会抛出「The entity type 'Child' requires a primary key to be defined」的错误。
你只需要在Fluent API配置里,给Child显式指定主键为ParentId,再结合原来的一对一关系配置就可以解决了,修改后的完整配置代码如下:
// Parent实体配置不变 builder.Entity<Parent>().ToTable("Parents"); builder.Entity<Parent>().Property(y => y.Id).UseSqlServerIdentityColumn(); // Child实体配置新增主键指定 builder.Entity<Child>().ToTable("Childs"); // 显式设置Child的主键为ParentId builder.Entity<Child>().HasKey(x => x.ParentId); // 配置一对一关系,外键复用这个主键字段 builder.Entity<Child>().HasOne(x => x.Parent) .WithOne(x => x.Child) .HasForeignKey<Child>(x => x.ParentId);
这样配置后,EF Core就能明确:
Child表的主键是ParentId- 这个
ParentId同时是关联Parent表Id字段的外键 - 两者之间形成严格的一对一关系(因为主键天然唯一,每个
Parent最多对应一个Child,每个Child也只能属于一个Parent)
如果偏好数据注解的方式,也可以直接在Child实体的ParentId属性上添加特性,这样可以简化Fluent API配置:
public class Child { [Key] [ForeignKey("Parent")] public Int32 ParentId { get; set; } public virtual Parent Parent { get; set; } }
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

