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

C# EF core:无法使用ID属性插入具有外键的对象(仅导航属性有效),c#,entity-framework-core,C#,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 {

我正在使用实体框架核心创建(代码优先)数据库模型。
在模型中,我有以下几个类:

[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; }
}
我的问题是,如果我尝试在DB设置
GroupId
IdentityId
中插入具有有效值的
成员身份
,则会出现以下错误:

Npgsql.PostgresException:23503:表“memberships”的插入或更新违反外键约束“memberships\u group\u id\u fkey”

要插入
成员身份
对象,我需要设置
标识
导航属性,然后一切正常


有没有不使用导航属性就插入新对象的方法?

我终于找到了问题所在。要复制(至少使用NpgSql):

所以,问题是我使用
0
作为我创建的对象的ID。
使用非零整数,即使是负数,似乎也能起作用。

我想这可能是NpgSql中的错误,因为0似乎是ID的有效值(因为我可以在DB中手动插入记录)

设置FKs时,导航属性是
null
还是包含一些对象?还有,您使用的是什么EF核心版本?是的,导航属性为
null
。我正在使用EF core 1.1.2。@IvanStoev感谢您的检查:)@IvanStoev,出于好奇,我发现了这个问题(见下面的答案)。这是因为我使用
0
s作为ID:(啊哈,我认为这对于SqlServer也会爆炸。0(CLR默认值)被视为未指定,因此自动生成。请参阅
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");
}
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!

}