EF Core一对零关系的一种方式

Dan*_*Dan 5 entity-framework-core

只能以一种方式创建一对一关系吗?

public class Class1
{
   [Key]
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public int Class1Id { get; set; }
   ...
}

public class Class2
{
   [Key]
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public int Class2Id { get; set; }

   public int? RelationshipId { get; set; }

   public virtual Class1 Relationship { get; set; }

   ...
}
Run Code Online (Sandbox Code Playgroud)

而且配置看起来像这样

public void Configure(EntityTypeBuilder<Class2> builder)
{
   builder.ToTable("...");

   builder.HasOne(m => m.Relationship)
     .WithOne()
     .HasForeignKey<Class1>(a => a.Class1Id);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试检查Class2实例中的Relationship时,出现了问题。RelationshipId具有一个值,而Relationship.Class1Id具有不同的值。Relationship.Class1Id与Class2Id具有相同的值。

为了让EF Core正常工作,Class1是否还需要具有Class2类型的属性?

Iva*_*oev 12

为了让EF Core正常工作,Class1是否还需要具有Class2类型的属性?

否。错误在于FK映射:

.HasForeignKey<Class1>(a => a.Class1Id)
Run Code Online (Sandbox Code Playgroud)

这样,你告诉EF它应该使用Class1Id的财产Class1作为双方PK和FK来Class2,在这种情况下RelationshipId的财产Class2不作为FK治疗,但像任何其他简单的属性。

相反,您应该指定关系的FK属性(1)处于打开状态,Class2并且(2)称为RelationshipId

builder.HasOne(e => e.Relationship)
    .WithOne()
    .HasForeignKey<Class2>(e => e.RelationshipId);
//                   ^                 ^
//                  (1)               (2)
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢。我认为我对使用Author和AuthorBiography的示例感到困惑,并且混合了类 (2认同)