【问题标题】:How can I configure a one to one relationship to have the foreign key also be a primary key?如何配置一对一关系以使外键也成为主键?
【发布时间】:2020-08-09 18:58:38
【问题描述】:

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

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

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

    public string Prop1{get;set;}
}

我想把它配置成这样的表格:

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");

【问题讨论】:

  • 这能回答你的问题吗? EF Core One to One or Zero Relationship
  • 嗯,您在我写答案时更新了问题。您的最新更新有什么问题,基本上它与我的答案相同(只是使用更明确的属性映射)?我在发布之前测试了我的答案,并且没有错误地获得了所需的数据库模型。

标签: entity-framework-core ef-core-3.1


【解决方案1】:

正如我对建议的重复问题 EF Core One to One or Zero Relationship 的回答中所述,共享 PK 关联(PK 也是 FK 的依赖实体)是一对一或零必需关系的默认 EF Core 映射。

但是,您的问题中的具体内容(并防止将答案直接应用于相关帖子)是依赖实体中缺少显式属性以映射为 PK/FK。所以你问的是可能的,但需要处理shadow properties

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

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

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

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多