Doctrine 坚持不更新现有记录,而是试图创建一个新记录

Doctrine persist not updating existing records but trying to create a new one

在我的应用程序中,我的域模型(聚合)不同于数据库模型(实体),因此我有一个单独的聚合和学说实体 classes,以及一个映射器 class 这是在 getting/persisting 之前从聚合构建学说实体,反之亦然,我直接在存储库中这样做:

  public function persist(Aggregate $aggregate): void
    {
        $this->entityManager->persist(
            $this->mapper->mapToDoctrineEntity($aggregate)
        );
    }

    public function get(AggregateId $id): Aggregate
    {
        /**
         * @var ?DoctrineEntity $entity
         */
        $entity = $this->entityManager->find(DoctrineEntity::class, $id->toInt());

        if (null === $entity) {
            throw new AggregateNotFoundException(sprintf('Aggregate [%d] not found', $id->toInt()));
        }

        return $this->mapper->mapToAggregate($entity);
    }

mapper 所做的只是创建新的 class 学说实体或聚合,这取决于我们需要创建和填充来自 entity/aggregate 的数据。创建新记录时一切正常,但是当我尝试更新现有记录时,学说看不到数据库中已提供 id 的实体并尝试插入它,这会导致重复错误。有没有办法以某种方式通知学说它是现有记录????

顺便说一句,在更新记录之前,我使用 repo 方法 get 从数据库中获取现有记录,但可能是由于从学说实体到聚合的转换,学说对该实体的松散跟踪

在学说之上自定义映射器似乎不是一个好主意。 Doctrine 已经是一个数据映射器,实体是一个领域模型。

但是如果你真的需要它,你必须保留你从存储库中获得的实体,并在发生变化时更新它。