我正在使用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; }
}
Membership
是Group
和Identity
之间的多对多关系。
我已经使用流畅的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");
}
我的问题是,如果我尝试在数据库设置Membership
和GroupId
中插入有效值的IdentityId
,我会收到此错误:
Npgsql.PostgresException:23503:在表上插入或更新“membership”会违反外键约束“memberships_group_id_fkey”
要插入Membership
对象,我需要设置Group
和Identity
导航属性,然后一切正常。
有没有办法在不使用导航属性的情况下插入新对象?
答案 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中手动插入记录)。