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 已经是一个数据映射器,实体是一个领域模型。
但是如果你真的需要它,你必须保留你从存储库中获得的实体,并在发生变化时更新它。
在我的应用程序中,我的域模型(聚合)不同于数据库模型(实体),因此我有一个单独的聚合和学说实体 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 已经是一个数据映射器,实体是一个领域模型。
但是如果你真的需要它,你必须保留你从存储库中获得的实体,并在发生变化时更新它。