我有以下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();
}
}
每个类别包含许多CategoryDetail元素。
每个父母都包含许多孩子,并且是特定类别的成员。
每个子对象都包含一个指向其父对象的指针,以及一个指向特定CategoryDetail元素的指针。
当我运行UpdateChild方法时,上下文中充满了对Category及其CategoryDetail元素的添加引用。当上下文尝试保存更改时,它抱怨它已经具有对这些项目的现有引用。
我可以在Context.ChangeTracker中看到,确实,元素在添加状态中不止一次存在。
我已经尝试了多种方案来确保不会发生这种情况,但是还没有成功。我尝试过手动将其他项目的状态更改为未更改等,但似乎找不到不碰到另一堵墙的方法。
如何使上下文保持“干净”?
您是否跳过了建立关系的所有ID?没有构成对象身份的属性。
您必须确保只有一个DbContext,您可以从中加载实体并将其保存到。有两个不同的实例可能会导致第二次“添加”。
调用方法“ UpdateChild”,但确实在内部创建了一个新的Child,这已经是一个奇怪的命名。除了用新对象填充DbContext之外,您还期望什么?没有“更新”,因为您永远不会从DbContext加载任何东西。