Как сделать уникальное ограничение на отношения ОДИН к МНОГИМ? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть две сущности: project и actor.

export abstract class BaseEntityModel {
  @PrimaryGeneratedColumn()
  id: number;
}

@Entity()
export class Project extends BaseEntityModel {
    @Column()
    title: string;

    @OneToMany(type => Actor, actor => actor.project)
    @JoinColumn()
    actors: Actor[];
}

@Entity()
export class Actor extends BaseEntityModel {
    @Column({unique: true}) 
    title: string;

    @ManyToOne(type => Project, project => project.actors)
    project: Project;
}

Мне нужен уникальный заголовок актера для проекта, но не для всей базы данных.

OK

projects: [
  {
    title: "webapp",
    actors: [
      {
        title: "dev"
      }
    ]
  },
  {
    title: "json-parser",
    actors: [
      {
        title: "dev"
      },
      {
        title: "target"
      }
    ]
  }
]

НЕ ОК

projects: [
  {
    title: "webapp",
    actors: [
      {
        title: "dev"
      },
      {
        title: "dev"
      }
    ]
  },
  {
    title: "json-parser",
    actors: [
      {
        title: "dev"
      },
      {
        title: "target"
      }
    ]
  }
]

@Column({unique: true}) работают как уникальные для всей таблицы, это не то, что я хочу.Существует также декоратор класса @Unique(['title']), но, похоже, он делает то же самое.

Есть ли что-то из TypeORM, которое я могу использовать, или я должен проверить себя, если actor.title уже существует в проекте,Чтобы избежать дублирования actor.title в том же проекте.Сохраняя возможность иметь несколько раз одно и то же actor.title в базе данных?

Обратите внимание, что сущность Actor не должна быть общей для projects (отношения между многими и многими). ​​

1 Ответ

0 голосов
/ 15 февраля 2019

Добавление декоратора класса @Unique(['title', 'project']) к Actor, похоже, то, что я искал, обратите внимание, что я как-то «испортил» свою базу данных, и миграция работала правильно только после удаления / создания.

...