为什么学说认为现有实体是一个新实体?

时间:2015-10-08 04:26:55

标签: symfony doctrine

我有两个实体,用户和商店,他们有多对一的关系,在创建用户之前,我必须确保商店存在,在创建用户时不允许创建商店,这意味着不能使用cascade = {“persist”}。

商店课程

public function addUser(User $user)
    {
        if (!$this->users->contains($user))
        {
            $this->users->add($user);
            $user->setStore($this);
        }
        return $this;
    }

在创建用户之前,我很确定商店已经存在。以下代码是我用来创建用户的方式

$store= $this->get('vmsp.store_provider')->getCurrentStore();
$store->addUser($user);
$userManager->updateUser($user);
updateUser方法中的

代码并不特殊:

$this->entityManager->persist($user);
$this->entityManager->flush();

getCurrentStore方法中的代码:

 public function getCurrentStore($throwException=true)
    {
        if (isset(self::$store)) {
            return self::$store;
        }

        $request = $this->requestStack->getCurrentRequest();
        $storeId = $request->attributes->get('storeId', '');

        $store = $this->entityRepository->find($storeId);
        if ($store === NULL&&$throwException) {
            throw new NotFoundHttpException('Store is not found');
        }
        self::$store = $store;


        return $store;
    }

这给了我一个错误:

  

通过这种关系找到了一个新的实体   'VMSP \ UserBundle \ Entity \ User#store'未配置为级联   坚持实体操作:〜#1。解决这个问题:要么   显式调用此未知实体上的EntityManager#persist()或   例如,configure cascade在映射中保持此关联   @ManyToOne(..,级联= { “持续”})

事情变得非常有趣,为什么现有商店成为新实体?为什么学说认为现有商店实体是一个新实体?

1 个答案:

答案 0 :(得分:0)

似乎您的Store - 实体以某种方式与EntityManager分离。我无法真正看到它发生的地方。找出它可能需要你做一些调试会议。

快速修复可能是使用EntityManager::merge($entity)将用户的商店合并回EntityManager,例如在您的updateUser方法中:

public function updateUser(User $user) {
    $store = $user->getStore();
    $this->entityManager->merge($store);
    $this->entityManager->persist($user);
    $this->entityManager->flush();
}

您可能还想使用Doctrine的UnitOfWork,尤其是getState($entity, $assumedState),以了解您的商店是否仍然受到管理。