EF Core Add()方法删除数据库记录

时间:2019-04-08 15:00:58

标签: c# entity-framework asp.net-core entity-framework-core

这看起来很奇怪,但是却发生了:当我尝试使用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%肯定!

1 个答案:

答案 0 :(得分:0)

考虑使用实体引用而不是直接设置FK。从上下文中检索用户,组织和职位,并将其引用添加到新的组合实体中,然后调用SaveChanges。如果您以后检查那些实体,这应该确保正确设置了所有引用的实体关系。对于EF Core,我建议对FK声明使用阴影属性,以避免暴露相同关系的两个单独的表示形式。 (UserOrganizationPosition.PositionId和UserOrganizationPosition.Position.PositionId)