我发现了一个奇怪的问题。我向我的实体添加了一些约束,发现数据库已更新,尽管约束失败并显示错误消息。
所以可以肯定的是,实体没有在控制器中传递persist()或flush()方法。
该问题仅出现在我之前从数据库加载的实体上,而不是新实例。
是否有一些自动保存或什么?有些听众会与其他实体打交道,他们可能会调用flush(),但为什么这对我的非持久化实体有效?
这是我的测试动作。经理只包括错误处理和访问控制,没有更多的魔力。
public function testAction()
{
$object = $this->get('object.manager')->load(42);
$object->setName('Test Autosave 2')
->setLabel('Test Autosave 2');
return array();
}
任何想法是什么导致了这个问题?
答案 0 :(得分:0)
如果在任何其他地方调用flush
方法,则将自动保存从数据库获取的实体(不包含persist
)。如果明确调用方法persist
,新实体将无法保存。
您可以阅读doc:
请注意,调用$ em-> persist(...)是不必要的。召回 这种方法只是告诉Doctrine管理或者观察"该 ......对象在这种情况下,因为您获取了...对象 来自Doctrine,它已经被管理了。
答案 1 :(得分:0)
实体与EntityManager分离,因此不再通过在其上调用EntityManager#detach($ entity)方法或通过将分离操作级联到它来进行管理。对分离的实体所做的更改(如果有的话)(包括删除实体)将在分离实体后不会同步到数据库。
http://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html#detaching-entities
我认为您应该将您的实体与经理分开,以便在编辑时不会更新。