子实体如何从一个父实体移动到另一个父实体

本文关键字:实体 一个 移动 另一个 | 更新日期: 2023-09-27 18:36:51

我正在使用 .Net 4 将应用程序从我的自定义 ORM 转换为实体框架。事情进展顺利,但我不确定如何将子项目移动到另一个父项目。我不确定我应该遵循什么模式。

使用 ORM,我生成了如下方法:

public void MoveTo_Item(Parent.Row destination)
{
    _inMovement = true;
    _parent_Item.Child_Items.Remove(this);
    parent_id = destination.id;
    destination.Child_Items.Add(this);
    _inMovement = false;
}

哪里:

  • _inMovement == true预防_parent_Item.Child_Items.Remove/Add(this)触发数据库中的删除/插入;和
  • parent_id = destination.id触发了数据库中的更新。
子项

本身有子项,所以不要以为我只能做parent1.Remove(item)后跟parent2.Add(item)

如何使用 EF .Net 4 正确更改父项?

子实体如何从一个父实体移动到另一个父实体

在 EF 中,如果导航属性设置正确,则应该只是一个问题(显然,此处是虚构的名称)

Child child = sourceParent.Children.First();  // or whatever
child.ParentObject = destinationParent;

顺便说一句,如果您的自定义 ORM 每次操作对象都会命中数据库(这一定是相当耗费资源的,不是吗?),您将需要调整到 EF 的工作方式,除非您明确说明,否则不会命中数据库。

以下是自我跟踪实体的解决方案。

使用 ObjectSet.Detach(YourObject) 将对象从一个对象集中分离。

有两个用于连接的功能。 如果对象是从数据库加载的,并且您希望 EF 为其使用 Update 语句,则应使用AttachAttach是需要用于分离实体的函数。

如果您刚刚在应用程序中创建了实体并且实体尚未在数据库中(Insert要使用的语句),则应使用AddObject

有关更多详细信息,请参阅 MSDN