【问题标题】:EF core: cannot insert object with foreign key using ID properties (only navigation properties work)EF 核心:无法使用 ID 属性插入具有外键的对象(仅导航属性有效)
【发布时间】:2018-09-21 10:59:37
【问题描述】:

我正在使用 Entity Framework Core 创建我的(代码优先)数据库模型。
在模型中,我有这些类:

[Table("groups")]
public class Group {
    public int? Id { get; set; }
    [JsonIgnore]
    public virtual ICollection<Membership> Members { get; set; }
}

[Table("identities")]
public class Identity {
    public int? Id { get; set; }
    [JsonIgnore]
    public virtual ICollection<Membership> MemberOf { get; set; }
}

[Table("memberships")]
public partial class Membership {
    [Column("group_id")]
    public int GroupId { get; set; }
    [Column("identity_id")]
    public int IdentityId { get; set; }
    [JsonIgnore]
    public virtual Group Group { get; set; }
    [JsonIgnore]
    public virtual Identity Identity{ get; set; }
}

MembershipGroupIdentity 之间的多对多关系。
我已经使用 fluent API 配置了这样的关系:

protected override void OnModelCreating(ModelBuilder modelBuilder) {
    var entity = modelBuilder.Entity<Membership>();
    entity.HasKey(e => new { 
        e.GroupId, 
        e.IdentityId }
    ).HasName("PK_identity_memberships");
    entity.HasOne(d => d.Group)
        .WithMany(p => p.Members)
        .HasForeignKey(d => d.GroupId)
        .HasConstraintName("memberships_group_id_fkey");
    entity.HasOne(d => d.Identity)
        .WithMany(p => p.MemberOf)
        .HasForeignKey(d => d.IdentityId)
        .HasConstraintName("memberships_identity_id_fkey");
}

我的问题是,如果我尝试在数据库设置 GroupIdIdentityId 中插入具有有效值的 Membership,我会收到此错误:

Npgsql.PostgresException: 23503: 在表“memberships”上插入或更新违反了外键约束“memberships_group_id_fkey”

要插入Membership 对象,我需要设置GroupIdentity 导航属性,然后一切正常。

有没有办法在不使用导航属性的情况下插入新对象?

【问题讨论】:

  • 当您设置 FK 时,导航属性是 null 还是它们包含一些对象?另外,您使用的是哪个 EF Core 版本?
  • 是的,导航属性是null。我正在使用 EF 核心 1.1.2。
  • @IvanStoev 感谢您查看此内容 :)
  • @IvanStoev,出于好奇,我发现了问题(请参阅下面的答案)。这是因为我使用0s 作为 ID :(
  • 啊哈,我认为这对于 SqlServer 也会爆炸。 0(CLR 默认值)被视为未指定,因此自动生成。见Value generated on add

标签: c# entity-framework-core


【解决方案1】:

我终于找到了问题所在。重现(至少使用 NpgSql):

using (var db = new TestContext()) {

    // This works:
    db.Groups.Add(new Group {
        Id = 42,
    });
    db.Identities.Add(new Identity {
        Id = 666,
    });
    db.SaveChanges();

    db.Memberships.Add(new Membership { 
        GroupId = 42,
        IdentityId = 666
    });
    db.SaveChanges();

    // this explodes...
    db.Groups.Add(new Group {
        Id = 0,
    });
    db.Identities.Add(new Identity {
        Id = 0,
    });
    db.SaveChanges();

    db.Memberships.Add(new Membership { 
        GroupId = 0,
        IdentityId = 0
    });
    db.SaveChanges(); // exception here!

}

所以,问题在于我使用 0 作为我创建的对象的 ID。
使用非零整数(甚至是负数)似乎也可以代替。
我想这可能是 NpgSql 中的一个错误,因为 0 似乎是 ID 的有效值(因为我可以在数据库中手动插入记录)。

【讨论】:

    猜你喜欢
    • 2020-05-30
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2019-01-05
    • 2017-06-26
    • 2012-07-06
    • 1970-01-01
    • 2014-01-20
    相关资源
    最近更新 更多