EF核心:无法使用ID属性插入具有外键的对象(仅导航属性有效)

时间:2018-04-11 13:58:46

标签: c# entity-framework-core

我正在使用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之间的多对多关系。
我已经使用流畅的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");
}

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

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

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

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

1 个答案:

答案 0 :(得分: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的有效值(因为我可以在DB中手动插入记录)。