C# EF Core Add()方法删除数据库记录
这看起来很奇怪,但确实发生了:当我尝试使用EF Core向我的DB添加新记录时,该方法首先删除一些其他记录 我有3个包含用户、组织和职位的数据库表,还有一个链接数据的表UserOrganizationPosition表。每种组合都是可能的,但应该是唯一的 型号C# EF Core Add()方法删除数据库记录,c#,entity-framework,asp.net-core,entity-framework-core,C#,Entity Framework,Asp.net Core,Entity Framework Core,这看起来很奇怪,但确实发生了:当我尝试使用EF Core向我的DB添加新记录时,该方法首先删除一些其他记录 我有3个包含用户、组织和职位的数据库表,还有一个链接数据的表UserOrganizationPosition表。每种组合都是可能的,但应该是唯一的 型号 public partial class User { public string UserID { get; set; } public string UserName { get; set; } public
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; }
}
在此调用之前,我检查组合是否不存在,并且我知道使用的ID确实存在于其他表中
我的数据库中填充了许多UserOrganizationPosition,当我添加一个新数据库时,其他一些UserOrganizationPosition会被删除。有人知道这是怎么发生的吗
我不是100%确定,但它似乎不接受2/3的多个组合相同的组合如下:
aaa BBB 222
ccc DDD 333考虑使用实体引用,而不是直接设置FKs。从上下文中检索用户、组织和职位,并将其引用添加到新的组合实体,然后调用
SaveChanges
。如果以后检查这些实体,则应确保正确设置所有引用的实体关系。对于EF Core,我建议对FK声明使用阴影属性,以避免暴露同一关系的两个单独表示。(UserOrganizationPosition.PositionId和UserOrganizationPosition.Position.PositionId)考虑使用实体引用,而不是直接设置FKs。从上下文中检索用户、组织和职位,并将其引用添加到新的组合实体,然后调用SaveChanges
。如果以后检查这些实体,则应确保正确设置所有引用的实体关系。对于EF Core,我建议对FK声明使用阴影属性,以避免暴露同一关系的两个单独表示。(UserOrganizationPosition.PositionId和UserOrganizationPosition.Position.PositionId)我不能在一个干净的新项目中仅使用post中的代码进行复制-可以吗?是的,我可以。我发现了问题!当我检查一个组合是否存在时,我调用了一个方法,该方法从一个组合中删除了一些位置(视图所需的位置),不幸地被保存到了数据库中。我无法在一个干净的新项目中仅使用post中的代码进行复制-可以吗?是的,我可以。我发现了问题!当我检查组合是否存在时,我调用了一个方法,该方法从组合中删除了一些位置(视图需要),不幸的是,该方法被保存到了数据库中。
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);
}
WebDbContext.Add(
new UserOrganizationPosition{
UserID = "aaa",
OrganizationID = "BBB",
PositionID = "222"
}
);