【问题标题】:EF Core - make foreign key optionalEF Core - 使外键可选
【发布时间】:2021-11-14 22:07:03
【问题描述】:

我有2个模型如下。

盒子

案卷详情

一个 DocketDetail 最多可以有 3 个与之关联的框(第一个是必需的,后两个是可选的)。 DocketDetail 模型的这种关系定义如下。

 [ForeignKey("Box1Id")]
    public Box Box1 { get; set; }           
    public Guid Box1Id { get; set;}

    [ForeignKey("Box2Id")]
    public Box Box2 { get; set; }           
    public Guid? Box2Id { get; set;}
    
    [ForeignKey("Box3Id")]        
    public Box Box3 { get; set; }                   
    public Guid? Box3Id { get; set;}

我还有以下 Fluent API 脚本来将关系设置为可选

 modelBuilder.Entity<DocketDetail>()
            .HasOne(dd => dd.Box1)
            .WithMany()
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<DocketDetail>()
            .HasOne(dd => dd.Box2)
            .WithMany()
            .HasForeignKey(dd => dd.Box2Id) 
            .IsRequired(false)
            .OnDelete(DeleteBehavior.NoAction);

        modelBuilder.Entity<DocketDetail>()
            .HasOne(dd => dd.Box3)
            .WithMany()     
            .HasForeignKey(dd => dd.Box3Id) 
            .IsRequired(false)
            .OnDelete(DeleteBehavior.NoAction);

但是,EF 迁移会强制生成外键。为了使这些关系成为可选,我缺少什么?

 migrationBuilder.AddForeignKey(
            name: "FK_DocketDetail_Box_Box1Id",
            table: "DocketDetail",
            column: "Box1Id",
            principalTable: "Box",
            principalColumn: "Id",
            onDelete: ReferentialAction.Restrict);

        migrationBuilder.AddForeignKey(
            name: "FK_DocketDetail_Box_Box2Id",
            table: "DocketDetail",
            column: "Box2Id",
            principalTable: "Box",
            principalColumn: "Id");

        migrationBuilder.AddForeignKey(
            name: "FK_DocketDetail_Box_Box3Id",
            table: "DocketDetail",
            column: "Box3Id",
            principalTable: "Box",
            principalColumn: "Id");

【问题讨论】:

标签: entity-framework-core key optional


【解决方案1】:

所以问题不在于模型或 Fluent API。我试图在可选框字段中存储一个空 Guid (System.Guid.Empty),但这会产生外键约束错误。存储 null(因为该字段可以为 null)解决了约束错误。

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 2022-09-22
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    相关资源
    最近更新 更多