【问题标题】:Cascade operation in OneToOne Relationship which is confusingOneToOne 关系中的级联操作令人困惑
【发布时间】:2016-02-05 11:50:54
【问题描述】:

我有两个相关的对象:

用户

/**
 * @ORM\OneToOne(targetEntity="File", mappedBy="userProfileImage")
 */
protected $profileImage;

文件

/**
 * @ORM\OneToOne(targetEntity="User", inversedBy="profileImage")
 * @ORM\JoinColumn(name="userProfileImage", referencedColumnName="id", onDelete="SET NULL")
 */
protected $userProfileImage;

以及我数据库中的两条相关记录。我想删除旧的 File 对象并用新的 File 替换它。问题是我无法删除 File 对象,因为我有以下错误:

通过关系“MyBundle\Entity\User#profileImage”找到了一个新实体,该实体未配置为对实体进行级联持久化操作:MyBundle\Entity\File@000000001604d7ad000000003cc76066。要解决此问题:在此未知实体上显式调用 EntityManager#persist() 或配置级联在映射中保持此关联,例如 @ManyToOne(..,cascade={"persist"})。如果您无法找出导致问题的实体,请执行“MyBundle\Entity\File#__toString()”以获取线索。

在我看来,调用后删除应该可以工作:

$this->getDoctrine()-getManager()->remove( $user->getProfileImage() );
$this->getDoctrine()-getManager()->flush();

我尝试将cascade={"all"}cascade={"persist", "remove"} 添加到$profileImage 注释但没有成功。我需要有人来解释我做错了什么以及我应该怎么做。

【问题讨论】:

    标签: symfony doctrine-orm doctrine symfony-2.7


    【解决方案1】:

    我不确定这是否是解决方案,但我认为它应该明确告诉级联删除

    /**
     * @ORM\OneToOne(targetEntity="User", inversedBy="profileImage", cascade={"persist", "remove")
     * @ORM\JoinColumn(name="userProfileImage", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $userProfileImage;
    

    【讨论】:

      【解决方案2】:

      我找到了解决方案: 要删除相关对象,我不应该直接删除它:

      $this->getDoctrine()-getManager()->remove( $file );
      

      但由用户通过:

      $userFile = $user->getProfileImage();
      $this->getDoctrine()-getManager()->remove( $userFile );
      $this->getDoctrine()-getManager()->remove( $file );
      

      另外,上面代码前后都要调用flush()

      $this->getDoctrine()-getManager()->flush();
      
      $userFile = $user->getProfileImage();
      $this->getDoctrine()-getManager()->remove( $userFile );
      $this->getDoctrine()-getManager()->remove( $file );
      
      $this->getDoctrine()-getManager()->flush();
      

      我不知道为什么,但它对我来说很好,也许对其他人有用。

      这并没有改变事实,这是一个非常丑陋的解决方案,所以如果有人知道如何改进此代码,请告诉我!我将不胜感激。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-04
        • 2014-02-03
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        相关资源
        最近更新 更多