Validation 在数据库中更新实体而不调用persist()

Validation 在数据库中更新实体而不调用persist(),validation,symfony,doctrine-orm,Validation,Symfony,Doctrine Orm,我发现了一个有点奇怪的问题。我向我的实体添加了一些约束,发现尽管约束失败并且显示了错误消息,但数据库还是被更新了 所以可以肯定的是,该实体不会在控制器中传递persist或flush方法 这个问题只会出现在我以前从数据库加载的实体上,而不会出现在新实例上 有什么自动保存的吗?有些侦听器处理其他实体,它们可能会调用flush,但为什么这会影响我的非持久化实体 这是我的测试动作。管理器只包括errorhandling和accesscontrol,没有更多的魔力 public function tes

我发现了一个有点奇怪的问题。我向我的实体添加了一些约束,发现尽管约束失败并且显示了错误消息,但数据库还是被更新了

所以可以肯定的是,该实体不会在控制器中传递persist或flush方法

这个问题只会出现在我以前从数据库加载的实体上,而不会出现在新实例上

有什么自动保存的吗?有些侦听器处理其他实体,它们可能会调用flush,但为什么这会影响我的非持久化实体

这是我的测试动作。管理器只包括errorhandling和accesscontrol,没有更多的魔力

public function testAction()
{
    $object = $this->get('object.manager')->load(42);
    $object->setName('Test Autosave 2')
         ->setLabel('Test Autosave 2');

    return array();
}
知道是什么导致了这个问题吗?

如果在任何其他地方调用flush方法,从数据库中获取的实体将自动保存,而不会持久化。如果没有明显调用persist方法,则不会保存新实体

您可以在中阅读:

请注意,调用$em->persist。。。没有必要。回忆起 这种方法只是告诉条令管理或监视 ... 对象在这种情况下,由于您获取了。。。对象 从理论上讲,它已经被管理好了

实体与EntityManager分离,因此不再通过调用其上的EntityManagerdetach$entity方法或通过将分离操作级联到该实体来进行管理。分离实体后,对分离实体所做的更改(如果有,包括删除该实体)将不会同步到数据库


我认为您应该将您的实体与manager分离,这样它就不会在编辑时对其进行更新。

好的,但我如何防止这种行为?我需要在更新工作流中加载和更改实体,还需要控制是否更新实体,具体取决于验证。当用户调用页面时,我还必须保存完全不相关的实体。我认为您必须找到调用刷新的位置。这应该如何解决我的问题?一个实体被加载,由userinput更改,并通过错误进行验证。这是必要的,因为我们希望以我们的形式再次显示数据。在应用程序的另一个点上,是一个不同的、不相关的实体,它做一些事情,应该持久化和刷新它。那么,如果我不再能够控制是否保存数据,有什么好处呢?如果获取的对象没有更改,它们将不会再次保存到数据库中。或者您想更改它们,但不想持久化?当然,因为这是生成的编辑/更新操作中的默认设置。如果存在无效值,则按id加载实体、绑定formdata、验证和更新。