我有两个实体,用户和商店,他们有多对一的关系,在创建用户之前,我必须确保商店存在,在创建用户时不允许创建商店,这意味着不能使用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(..,级联= { “持续”})
事情变得非常有趣,为什么现有商店成为新实体?为什么学说认为现有商店实体是一个新实体?
答案 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)
,以了解您的商店是否仍然受到管理。