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!
}