【问题标题】:EF core 6, adding new entities in a one-to-one relationshipEF core 6,以一对一关系添加新实体
【发布时间】:2023-02-10 22:08:37
【问题描述】:

我有两个具有(A 和 B)一对一关系的实体。 A 有一个主要的身份密钥 (Id),B 有一个外部的、没有身份的密钥 (Id)。

clas BaseEntity
{
    public int Id { get; set; }
    ...
}

class A : BaseEntity 
{        
    ...
    public virtual B B { get; set; }
}

class B : BaseEntity
{
    ...
    public virtual A A { get; set; }
}

modelBuilder.Entity<A>(entity =>
{
    entity.ToTable("A");

    entity.HasOne(d => d.B)
    .WithOne(p => p.A)
    .HasForeignKey<A>(d => d.Id)
    .OnDelete(DeleteBehavior.ClientSetNull)
    .HasConstraintName("FK_A_B")
    .IsRequired();
    ...
}

modelBuilder.Entity<B>(entity =>
{
    entity.ToTable("B");

    entity.Property(e => e.Id).ValueGeneratedNever();
});

当我将新的 B 实体添加到 EF 时,可能会发生 A 也是新的并且它还没有 Id。它必须由数据库生成,因为它是身份密钥。 这是错误消息:

INSERT 语句与 FOREIGN KEY 约束“FK_A_B”冲突。冲突发生在数据库“Database”、表“dbo.A”、“Id”列中。

当我检查生成的 SQL 命令时,我没有看到 A 表中的插入,并且当 A 也是新的时,B 表中的插入包含 0 值 Id。

当两个实体都是新的(添加的)并且 A 实体有身份密钥而 B 没有时,是否可以在一对一关系中插入两个实体?

【问题讨论】:

    标签: entity-framework-core one-to-one


    【解决方案1】:

    是的,可以在一对一关系中插入两个实体,其中实体 A 具有身份密钥而实体 B 没有。为此,您需要先将实体 B 添加到上下文中,然后设置实体 A 和 B 之间的关系,最后将更改保存到数据库中。

    这是一个例子:

        using (var context = new YourContext())
    {
        var b = new B();
        context.B.Add(b);
        context.SaveChanges();
    
        var a = new A();
        a.B = b;
        context.A.Add(a);
        context.SaveChanges();
    }
    

    通过在添加实体 B 后调用 SaveChanges,可以确保实体 B 已插入到数据库中并具有由数据库生成的 Id。然后您可以设置实体 A 和 B 之间的关系,并再次调用 SaveChanges 将两个实体插入到数据库中。

    【讨论】:

      猜你喜欢
      • 2019-11-11
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 2017-08-06
      • 2017-10-26
      • 2020-09-04
      • 2023-02-04
      相关资源
      最近更新 更多