Aurelia 实体管理器关闭了吗?

Aurelia 实体管理器关闭了吗?,aurelia,symfony-2.1,Aurelia,Symfony 2.1,第167行有错误,它告诉我EntityManager关闭了? 我用了symfony2和aurelia。 我放了“processUserDetails”来检查它。 private函数processUserDetails($library、$entity、$oldDetails、$settings){ $newDetails=$entity->getDetails(); $em=$this->getDoctrine()->getManager(); $this->disablebableableev

第167行有错误,它告诉我EntityManager关闭了? 我用了symfony2和aurelia。 我放了“processUserDetails”来检查它。
private函数processUserDetails($library、$entity、$oldDetails、$settings){
$newDetails=$entity->getDetails();
$em=$this->getDoctrine()->getManager();
$this->disablebableableeventlisteners($em);
foreach($oldDetails作为$detail){
如果(!$newDetails->contains($details)){
$library->removeesource($detail->getResource());
$em->remove($detail);
}
}
$em->flush();
$this->enablebreableeventlisteners($em);
foreach($newDetails作为$detail)
如果(!$detail->getId())$em->persist($detail);
$em->flush();
foreach($newDetails作为$detail){
$resource=$detail->getResource();
如果(!$library->getResources()->包含($resource))
$library->addResource($resource);
}
$em->flush();
如果($this->getUser()==$entity->getUser()){
$this->putMembershipContactSetting($entity,$settings);
$locale=$entity->getLocale();
如果($locale&&$entity->getUser()->getLocale()!==$locale)
$this->setUserLocale($entity);
$em->flush();
}

}
您在
processUserDetails
中刷新得太早了。它需要重构方法/类,以确保在适当的时间调用
flush()
。一个快速修复方法是让该方法接受
EntityManager
作为参数,并使用一个可选参数告诉它不要在最后刷新:

私有函数processUserDetails($em、$library、$entity、$oldDetails、$settings、$doNotFlush){
$newDetails=$entity->getDetails();
$this->disablebableableeventlisteners($em);
foreach($oldDetails作为$detail){
如果(!$newDetails->contains($details)){
$library->removeesource($detail->getResource());
$em->remove($detail);
}
}
//脸红得太早?
//$em->flush();
$this->enablebreableeventlisteners($em);
foreach($newDetails作为$detail)
如果(!$detail->getId())$em->persist($detail);
//脸红得太早?
//$em->flush();
foreach($newDetails作为$detail){
$resource=$detail->getResource();
如果(!$library->getResources()->包含($resource))
$library->addResource($resource);
}
//脸红得太早?
//$em->flush();
如果($this->getUser()==$entity->getUser()){
$this->putMembershipContactSetting($entity,$settings);
$locale=$entity->getLocale();
如果($locale&&$entity->getUser()->getLocale()!==$locale)
$this->setUserLocale($entity);
//脸红得太早?
$em->flush();
}
如果(!doNotFlush){
$em->flush();
}
}
然后在
putMembershipAction()中:

if($entity->getStatus()==Membership::STATUS\u接受)
$this->processUserDetails($em、$library、$entity、$oldDetails、$settings,true);
// .... 
//在返回之前,冲洗它
$em->flush();
//现在返回
返回$entity;

请注意,这样做会改变
processUserDetails
的工作方式,您应该重新验证流。关键的一点是将每个实体都保存在内存中,最后只调用一次
flush()

我想EntityManager负责连接到数据库并对其执行一些操作。您正在完成函数调用并过早地终止与数据库的连接。上面的代码块中有什么异步的东西需要等待吗?@bigopon,没有,你能检查processuser细节中的fluch()吗?我想问题在于它,但我不知道它的正确位置是的,这应该是问题所在。flush()导致连接关闭。这就是错误的原因。你应该把它放在最后。它从哪里来。@bigopon哪一个是不正确的?我不知道我应该把fluch放在哪里?