Entity framework 使用子实体和孙实体更新实体

Entity framework 使用子实体和孙实体更新实体,entity-framework,entity-framework-5,entity-framework-6,Entity Framework,Entity Framework 5,Entity Framework 6,我试图找到问题的最佳解决方案,同时更新具有深厚关系的实体。因为我的实体太复杂,并且有更深层次的关系,所以我将其简化为 MainCategory-Category具有一对多关系,Category-SubCategory也具有一对多关系 public class MainCategory { [Key] public int Id { get; set; } public string MainCategoryName { get; set; } public vi

我试图找到问题的最佳解决方案,同时更新具有深厚关系的实体。因为我的实体太复杂,并且有更深层次的关系,所以我将其简化为

MainCategory-Category具有一对多关系,Category-SubCategory也具有一对多关系

public class MainCategory
{
    [Key]
    public int Id { get; set; }
    public string MainCategoryName { get; set; }

    public virtual ICollection<Category> Categories { get; set; }
}

public class Category
{
    [Key]
    public int Id { get; set; }
    public string CategoryName { get; set; }

    public virtual ICollection<SubCategory> SubCategories { get; set; }
}

public class SubCategory 
{
    [Key]
    public int Id { get; set; }
    public string SubCategoryName { get; set; }

    public Category Category { get; set; }
}
代码问题
  • 由于更新机制是删除旧实体及其子实体和孙实体并添加新实体,所以每次都刷新数据库记录的Id值。如果不同表中的MainCategory、Category或SubCategory存在任何外键,这将是一个大问题
  • 第一个问题可以这样解决

        foreach (var category in mainCategoryFromDb.Categories)
        {
             foreach (var subCategory in category.SubCategories)
             {
                  // Set subCategory properties
             }
    
             // Set category properties
        }
    
        // Set mainCategoryFromDb properties
    
    这解决了Id丢失的问题,但正如我所写的,实体非常复杂。这将很难维护,例如,我们不知道maincography的哪个类别将更新maincographyFromDB的类别,因为maincography及其子实体和孙子实体没有Id属性


我正在寻找一种解决问题的方法。

您的问题是您使用的是断开连接的实体,因此它们不会受到
DbContext
的监控。因此,您需要做的是在断开连接的场景中自己跟踪更改,然后,当您将更改附加回
DbContext
时,根据跟踪的更改为每个实体设置正确的状态

没有fiex解决方案可以跟踪更改,但是,要将更改发送到数据库,只需将根对象附加到上下文,然后设置每个被跟踪实体的状态


请看。这显示了附加和设置状态的基本方式。然后,您只需设置不同的状态,除了
未更改
,如本问答中所示。

但我认为,要附加的实体必须是一个id属性才能与数据库记录匹配?我的DTO对象没有。
    foreach (var category in mainCategoryFromDb.Categories)
    {
         foreach (var subCategory in category.SubCategories)
         {
              // Set subCategory properties
         }

         // Set category properties
    }

    // Set mainCategoryFromDb properties