C# EntityFramework升级与数据保持同步

C# EntityFramework升级与数据保持同步,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我有两门课: [Table("Accomplishments")] public class Accomplishment : AuditedEntity { [Required] public virtual string Name { get; set; } public virtual int? CriteriaGroupId { get; set; } [ForeignKey("CriteriaGroupId")] public Crite

我有两门课:

[Table("Accomplishments")]
public class Accomplishment : AuditedEntity 
{

    [Required]
    public virtual string Name { get; set; }

    public virtual int? CriteriaGroupId { get; set; }

    [ForeignKey("CriteriaGroupId")]
    public CriteriaGroup CriteriaGroupFk { get; set; }

}

 [Table("CriteriaGroups")]
public class CriteriaGroup : CreationAuditedEntity 
{       
    public List<CriteriaGroup> Groups { get; set; }
}
[表(“成绩”)]
公共课成绩:受审核性
{
[必需]
公共虚拟字符串名称{get;set;}
公共虚拟int?CriteriaGroupId{get;set;}
[ForeignKey(“CriteriaGroupId”)]
公共准则组准则组fk{get;set;}
}
[表(“标准组”)]
公共类标准组:CreationAuditedEntity
{       
公共列表组{get;set;}
}
我有一个ui,在其中我有一个保存操作来创建或更新整个子类的完成

我的问题是:

第一次:用户通过ui选择CriteriaGroup1和CriteriaGroup2-->保存正常,并且使用Accomplement创建条件组

第二次:用户通过ui选择CriteriaGroup3并取消选择CriteriaGroup1-->,然后我保存,CriteriaGroup3就创建好了。但是CriteriaGroup1应该从数据库中删除,它仍然在数据库中

EntityFramework不会自动删除两次节省之间的实体差异

那我怎么做呢?如何使用EF core对其进行自动管理


谢谢,

当您更新实体时,您应该包括子实体(外键实体)以及您正在更新的实体。否则,当您添加它们时,它们会继续添加,而不会删除现有的

var accomplishment = dataContext.Accomplishments.Where(a => a.Id = id)
.Include(a => a.CriteriaGroupFk)
.FirstOrDefault();

accomplishment.CriteriaGroupFk = [Your new List]

dataContext.SaveChanges();

现在,实体框架删除以前链接的子实体(如果不再存在)。

用户通过ui选择CriteriaGroup3并取消选择CriteriaGroup1-->,然后我保存,CriteriaGroup3就创建好了。但是CriteriaGroup1应该从数据库中删除,它仍然在数据库中。
代码在哪里?它是一个有角度的UI。然后我得到完成对象并更新对象。在正常行为中,它应该删除不再链接的对象?我想问的是您的.net(假定控制器)代码,它链接任何响应HTTP请求的对象。Angular不会直接操作db。我尝试了您的解决方案,但出现了错误:“无法跟踪实体类型为'succession'的实例,因为已经在跟踪另一个具有{'Id'}相同键值的实例。”。附着现有实体时,请确保仅附着一个具有给定键值的实体实例。考虑使用“dBraveTopStudioBuffel.EnabasEngsivIdEdTracle”来查看冲突的键值。“一个主意?好吧,我通过这个链接来修复它:现在我看到在我的标准GigAUGP表中实现的是空的。这是一个很好的观点。但是,它不会删除该行。这是正常的行为吗?我是否应该安排sql server作业来删除completashmentId=null的行?不,您根本不应该这样做。EF会为你做这件事。在你的第一次评论中,你也不应该得到这一点。如果没有看到代码,我猜不出哪里会出错。您是否正在执行dataContext.successment.Add(successment)操作,然后再保存?如果是,这就是导致问题的原因。