实体框架:如何在不重新添加父母的情况下更新孩子

问题描述 投票:0回答:1

我有以下C#伪代码:

public class CategoryDetail
{
    public Category ParentCategory {get; set;}
}

public class Category
{
    public List<CategoryDetail> CategoryDetails {get; set;}
}

public class Child
{
    public CategoryDetail ThisCategoryDetail {get; set;}
    public Parent ThisParent {get; set;}
}

public class Parent
{
    public Category ThisCategory {get; set;}
    public List<Child> Children {get; set;}

    public CreateChild(DbContext Context)
    {
        Child NewChild = new Child();
        NewChild.ThisCategoryDetail = ThisCategory.CategoryDetails[0];
        NewChild.ThisParent = this;

        Children.Add(NewChild);
        Context.SaveChanges();
    }
}

每个类别包含许多CategoryDe​​tail元素。

每个父母都包含许多孩子,并且是特定类别的成员。

每个子对象都包含一个指向其父对象的指针,以及一个指向特定CategoryDe​​tail元素的指针。

当我运行UpdateChild方法时,上下文中充满了对Category及其CategoryDe​​tail元素的添加引用。当上下文尝试保存更改时,它抱怨它已经具有对这些项目的现有引用。

我可以在Context.ChangeTracker中看到,确实,元素在添加状态中不止一次存在。

我已经尝试了多种方案来确保不会发生这种情况,但是还没有成功。我尝试过手动将其他项目的状态更改为未更改等,但似乎找不到不碰到另一堵墙的方法。

如何使上下文保持“干净”?

c# entity-framework dbcontext savechanges
1个回答
0
投票

您是否跳过了建立关系的所有ID?没有构成对象身份的属性。

您必须确保只有一个DbContext,您可以从中加载实体并将其保存到。有两个不同的实例可能会导致第二次“添加”。

调用方法“ UpdateChild”,但确实在内部创建了一个新的Child,这已经是一个奇怪的命名。除了用新对象填充DbContext之外,您还期望什么?没有“更新”,因为您永远不会从DbContext加载任何东西。

© www.soinside.com 2019 - 2024. All rights reserved.