这看起来很奇怪,但是却发生了:当我尝试使用EF Core将新记录添加到数据库中时,该方法首先删除了一些其他记录。
我有3个具有用户,组织和职位的数据库表,以及1个链接数据的表,即UserOrganizationPosition表。每种组合都是可能的,但应该是唯一的。
模型
public partial class User
{
public string UserID { get; set; }
public string UserName { get; set; }
public virtual List<UserOrganizationPosition> _uop { get; set; }
}
public partial class Organization
{
public string OrganizationID { get; set; }
public string OrganizationName { get; set; }
public virtual List<UserOrganizationPosition> _uop { get; set; }
}
public partial class Position
{
public string PositionID { get; set; }
public string PositionName { get; set; }
public virtual List<UserOrganizationPosition> _uop { get; set; }
}
public partial class UserOrganizationPosition
{
public string UserID { get; set; }
public virtual User _user { get; set; }
public string OrganizationID { get; set; }
public virtual Organiaztion _organization { get; set; }
public string PositionID { get; set; }
public virtual Position _position { get; set; }
}
WebDbContext
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserOrganizationPosition>(entity =>
{
entity.HasKey(uop => new { uop.UserID, uop.OrganizationID, uop.PositionID});
});
modelBuilder.Entity<UserOrganizationPosition>()
.HasOne(uop => uop._user)
.WithMany(u => u._uop)
.HasForeignKey(uop => uop.UserID);
modelBuilder.Entity<UserOrganizationPosition>()
.HasOne(uop => uop._organization)
.WithMany(o => o._uop)
.HasForeignKey(uop => uop.OrganizationID);
modelBuilder.Entity<UserOrganizationPosition>()
.HasOne(uop => uop._position)
.WithMany(p => p._uop)
.HasForeignKey(uop => uop.PositionID);
}
我的方法
在我的方法中,我尝试添加一个新的UserOrganizationPosition:
WebDbContext.Add(
new UserOrganizationPosition{
UserID = "aaa",
OrganizationID = "BBB",
PositionID = "222"
}
);
在此调用之前,我检查该组合是否尚不存在,并且我知道其他表中确实存在使用的ID。
我的数据库中填充了许多UserOrganizationPosition,当我添加一个新的UserOrganizationPosition时,其他UserOrganizationPosition也被删除了。有谁知道这怎么可能?
我不确定100%,但是看起来它不接受2个f 3相同的组合的多个组合:
aaa BBB 222
ccc DDD 333 <-完全不同,没关系
aaa DDD 444 <-与aaa和DDD等同于其他一些链接是唯一的,没关系
aaa BBB 444 <-匹配第一个组合的3个部分中的2个,将被删除
再次:我对此不是100%肯定!
答案 0 :(得分:0)
考虑使用实体引用而不是直接设置FK。从上下文中检索用户,组织和职位,并将其引用添加到新的组合实体中,然后调用SaveChanges
。如果您以后检查那些实体,这应该确保正确设置了所有引用的实体关系。对于EF Core,我建议对FK声明使用阴影属性,以避免暴露相同关系的两个单独的表示形式。 (UserOrganizationPosition.PositionId和UserOrganizationPosition.Position.PositionId)