Entity framework 使用子实体和孙实体更新实体
我试图找到问题的最佳解决方案,同时更新具有深厚关系的实体。因为我的实体太复杂,并且有更深层次的关系,所以我将其简化为 MainCategory-Category具有一对多关系,Category-SubCategory也具有一对多关系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
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存在任何外键,这将是一个大问题
- 第一个问题可以这样解决
这解决了Id丢失的问题,但正如我所写的,实体非常复杂。这将很难维护,例如,我们不知道maincography的哪个类别将更新maincographyFromDB的类别,因为maincography及其子实体和孙子实体没有Id属性foreach (var category in mainCategoryFromDb.Categories) { foreach (var subCategory in category.SubCategories) { // Set subCategory properties } // Set category properties } // Set mainCategoryFromDb properties
我正在寻找一种解决问题的方法。您的问题是您使用的是断开连接的实体,因此它们不会受到
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