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

C# 实体框架:如何在不重新添加父项的情况下更新子项,c#,entity-framework,dbcontext,savechanges,C#,Entity Framework,Dbcontext,Savechanges,我有以下C#伪代码: public void TestFunc(int ParentId) { using DBContext Context = new DBContext(); Parent X = Context.Parents.Find(ParentId); X.CreateChild(); Context.SaveChanges(); } public class CategoryDetail { public int Id; publ

我有以下C#伪代码:

public void TestFunc(int ParentId)
{
    using DBContext Context = new DBContext();
    Parent X = Context.Parents.Find(ParentId);
    X.CreateChild();
    Context.SaveChanges();
}

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

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

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

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

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

        Children.Add(NewChild);
    }
}
public void TestFunc(int ParentId)
{
使用DBContext Context=new DBContext();
父X=Context.Parents.Find(ParentId);
X.CreateChild();
SaveChanges();
}
公共类类别详细信息
{
公共int Id;
公共类别ParentCategory{get;set;}
}
公共类类别
{
公共int Id;
公共列表类别详细信息{get;set;}
}
公营儿童
{
公共int Id;
公共类别详细信息ThisCategoryDetail{get;set;}
公共父项ThisParent{get;set;}
}
公共类父类
{
公共int Id;
公共类别ThisCategory{get;set;}
公共列表子项{get;set;}
公共CreateChild()
{
Child NewChild=NewChild();
NewChild.ThisCategoryDetail=ThisCategory.CategoryDetails[0];
NewChild.ThisParent=this;
添加(NewChild);
}
}
每个类别都包含许多CategoryDetail元素

每个父项都包含若干子项,并且是特定类别的成员

每个子元素都包含一个指向其父元素的指针以及一个指向特定CategoryDetail元素的指针

当我运行CreateChild方法时,上下文中充满了对Category及其CategoryDetail元素的添加引用。当上下文试图保存更改时,它会抱怨它已经有了对这些项的现有引用

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

我已经尝试了很多方案来确保这不会发生,但还没有成功。我曾尝试手动将其他项目的状态更改为“未更改”,等等,但似乎找不到在不撞到一面墙或另一面墙的情况下执行此操作的方法


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

您是否也可以发布您的
DBContext
,以及创建/检索父级并调用
CreateChild
的方法?这是一个非常复杂的系统的精髓,我无法在这里重新编写。但简而言之,出现问题的原因是,子对象和父对象都包含对同一对象(类别)的引用。这会导致类别多次加载到上下文中,有时其状态设置为“已添加”。然后SaveChanges会抱怨,因为它已存在于具有相同Id的数据库中,无法再次添加。我们无法查看您的类别加载的位置。如果它被多次加载,您很可能会使用上下文的多个实例,否则不会发生这种情况。我在清单的顶部添加了一些代码来演示:当我调用TestFunc时,它会找到一个父类,并在此时将一个未修改版本的类别加载到上下文中。然后,当调用CreateChild函数时,第二次出现的Category被加载到上下文中,但在本例中,它被标记为“Added”。这就是冲突发生的地方。1)我不断更改此处的代码以反映人们的评论。我已经从CreateChild中提取了上下文。在TestFunc方法中,这已经足够了。2) 创造一个完全依赖父母生存的孩子的模式是什么?