TypeORM: дублировать ключ при сохранении отношений с существующими объектами - PullRequest
0 голосов
/ 25 мая 2020

У меня есть следующая сущность в TypeORM:

@Entity('category')
export class Category {

  @Column({ length: 80 })
  public name: string;

  @OneToOne(
    (): ObjectType<Category> => Category,
    (category: Category): Category => category.parent,
    {
      cascade: ['insert', 'update'],
    }
  )
  @JoinColumn({ name: 'parent', referencedColumnName: 'id' })
  public parent: Category;
}

Затем я сохраняю несколько категорий в своей базе данных:

let parentCategory = new Category();
parentCategory.name = 'Parent Category';

let childCategory = new Category();
childCategory.name = 'Child Category';
childCategory.parent = parentCategory;

connection.manager.save(childCategory);

Наконец, я хочу добавить новую дочернюю категорию «Родительская категория» (учитывайте, что родительская категория была загружена из базы данных и содержит ее идентификатор):

let newChildCategory = new Category();
newChildCategory.name = 'New Child Category';
newChildCategory.parent = childCategory.parent; //<- childCategory.parent contains the parent ID

connection.manager.save(newChildCategory); //<- Throws duplicate key error due to cascade

Одно жизнеспособное решение - определение поведения ON DUPLICATE KEY, которое должно быть реализовано вручную в соответствии с эта информация . Есть ли другое решение, позволяющее сделать это при сохранении объекта без необходимости писать весь запрос, как в моем примере?

Этот репозиторий GitHub содержит приложение, воспроизводящее проблему.

1 Ответ

2 голосов
/ 25 мая 2020

Можете попробовать

@ManyToOne(
    type => Category,
    category => category.children,
    {
      cascade: ['insert', 'update'],
    }
)
public parent: Category;

@OneToMany(
    type => Category,
    category => category.parent,
    {
      cascade: ['insert', 'update'],
    }
)
public children: Category[];

?

Я не уверен, что это root причина вашей проблемы, но тип parent должен быть Category, а не category. Странно, что ваша IDE не предупредила вас, кстати.

Однако будьте осторожны, потому что вы определили отношение «категория-родитель» как тип OneToOne, но из приведенного вами примера вы его используете как отношение OneToMany / ManyToOne!

...