【问题标题】:EntityFramework upades keep sync with dataEntityFramework 更新与数据保持同步
【发布时间】:2019-10-31 09:20:05
【问题描述】:

我有两个班级:

[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; }
}

我有一个用户界面,我有一个保存操作来创建或更新子类的整个完成。

我的问题是:

第一次:用户通过 ui 选择 CriteriaGroup1 和 CriteriaGroup2 --> 保存没问题,条件组都创建完成

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

EntityFramework 不会自动删除两次储蓄之间的实体差异?

那我该怎么做呢?如何使用 EF Core 自动管理?

谢谢,

【问题讨论】:

  • the user through the ui Selects CriteriaGroup3 and deselect CriteriaGroup1 --&gt;&gt; Then I save and CriteriaGroup3 is well created. But CriteriaGroup1 should be removed from the database and it stills inside. 代码在哪里?
  • 这是一个有角度的用户界面。我得到了成就对象并更新了对象。在正常行为中,它应该删除不再链接的对象?
  • 我在询问您的 .net(假定控制器)代码,该代码链接任何内容以响应 Angular HTTP 请求。 Angular 不会直接操作数据库。

标签: c# entity-framework entity-framework-core


【解决方案1】:

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

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

accomplishment.CriteriaGroupFk = [Your new List]

dataContext.SaveChanges();

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

【讨论】:

  • 我尝试了您的解决方案,但出现错误:“无法跟踪实体类型“成就”的实例,因为已经在跟踪具有相同键值 {'Id'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。一个想法?
  • 好的,感谢这个链接,我修复了它:stackoverflow.com/questions/49798566/…
  • 现在我看到我的标准组表中的成就 ID 为空。这是一个好点。但是它不会删除该行。这是正常行为吗?我应该安排一个 sql server 作业来删除成绩为 null 的行吗?
  • 不,您根本不应该这样做。 EF 为您做到这一点。在您的第一条评论中,您也不应该得到它。如果没有看到代码,我无法猜测那里可能会出现什么问题。您是否在保存之前执行 dataContext.accomplishment.Add(accomplishment) ?如果是,那就是导致问题的原因。
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
相关资源
最近更新 更多