我有以下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);
}
}
每个类别都包含许多CategoryDetail元素。
每个父级包含多个子级,并且是特定类别的成员。
每个子对象都包含一个指向其父对象的指针,以及一个指向特定CategoryDetail元素的指针。
当我运行CreateChild方法时,上下文充满了添加回指向Category及其CategoryDetail元素的引用。当上下文尝试保存更改时,它抱怨说它已经具有对这些项目的现有引用。
我可以在Context.ChangeTracker中看到,确实,元素在添加状态中不止一次存在。
我尝试了多种方案以确保不会发生这种情况,但尚未成功。我曾尝试将其他项目的状态手动更改为未更改等,但似乎找不到不碰到一堵墙或另一堵墙的方法。
如何使上下文保持“干净”?