如何配置一对一关系以使外键也成为主键?

How can I configure a one to one relationship to have the foreign key also be a primary key?

我正在尝试建立这样的关系模型:

public class MyContainer {
   
    public int Id {get;set;}
}

public class MyCompontentOne
{
    public MyContainer MyContainer {get;set;}

    public string Prop1{get;set;}
}

我想配置它以获得这样的 table:

MyContainerId (FK & PK) | Prop1 |... other props

我已经使用 Fluent API 尝试了很多东西,但无论我做什么,我总是会遇到一些错误。这是我最近尝试过的:(添加阴影 属性 并使其成为外键)

            mb.Entity<MyCompontentOne>().Property<int>("MyContainerId").IsRequired();
            
            mb.Entity<MyCompontentOne>().Property(o => o.Prop1).IsRequired();
            mb.Entity<MyCompontentOne>()
                .HasOne(o => o.MyContainer)
                .WithOne();
            
            mb.Entity<MyCompontentOne>().HasKey("MyContainerId");

正如我在对建议的重复问题 的回答中提到的,共享 PK 关联(具有 PK 的依赖实体也是 FK)是一对一或零必需关系的默认 EF Core 映射。

虽然你的问题的具体内容(并阻止直接将答案应用于相关 post)是依赖实体中缺少明确的 属性 映射为 PK/FK.所以你问的是可能的,但需要处理 shadow properties.

以下是最小的流畅配置,它将配置 MyContainer(主体)和 MyCompontentOne(从属)之间的一对一或零关系,具有 (1) 导航 属性 MyContainerMyCompontentOne 中,(2) 在 MyContainer 中没有导航 属性,并且 (3) 在 MyContainerId 中需要阴影 FK 属性(和列) MyCompontentOne。然后(4)将阴影属性映射为PK:

modelBuilder.Entity<MyCompontentOne>()
    .HasOne(e => e.MyContainer) // (1)
    .WithOne() // (2)
    .HasForeignKey<MyCompontentOne>("MyContainerId") // (3)
    .IsRequired();

modelBuilder.Entity<MyCompontentOne>()
    .HasKey("MyContainerId"); // (4)