mikro-orm Cascade.REMOVE, это только для RDBMS? - PullRequest
1 голос
/ 10 апреля 2019

Я использую микро-форму с MongoDB и пытаюсь создать Cascade.REMOVE, но не могу заставить его работать.

Бизнес-объект:

@Entity({ collection: "business" })
export class BusinessModel implements BusinessEntity {
    @PrimaryKey()
    public _id!: ObjectId;

    @Property()
    public name!: string;

    @Property()
    public description!: string;

    @OneToMany({ entity: () => LocationModel, fk: "business", cascade: [Cascade.ALL] })
    public locations: Collection<LocationModel> = new Collection(this);
}

export interface BusinessModel extends IEntity<string> { }

Объект-местоположение:

@Entity({ collection: "location" })
export class LocationModel implements LocationEntity {
    @PrimaryKey()
    public _id!: ObjectId;

    @Property()
    public geometry!: GeometryEmbedded;

    @ManyToOne({ entity: () => BusinessModel})
    public business!: BusinessModel;

    public distance?: number;
}

export interface LocationModel extends IEntity<string> { }

Бизнес-данные:

_id: 5cac818273243d1439866227
name: "Prueba"
description: "Prueba eliminacion"

Данные о местоположении:

_id: 5cac9807179e380df8e43b6c
geometry: Object
business: 5cac818273243d1439866227

_id: 5cacc941c55fbb0854f86939
geometry: Object
business: 5cac818273243d1439866227

И код:

export default class BusinessData {
    private businessRepository: EntityRepository<BusinessModel>;

    public constructor(@inject(OrmClient) ormClient: OrmClient) {
        this.businessRepository = ormClient.em.getRepository(BusinessModel);
    }

    public async delete(id: string): Promise<number> {
        return await this.businessRepository.remove(id);
    }
}

"Бизнес" правильноудален, но все связанные "местоположения" продолжаются там.

В журнале только показано:

[query-logger] db.getCollection ("business"). deleteMany () [взял 0мс]

1 Ответ

0 голосов
/ 10 апреля 2019

Каскады работают на уровне приложений, поэтому для всех драйверов, включая монго.

Проблема в том, что вы удаляете сущность Business по id.Вы должны удалить его по ссылке - укажите сущность и убедитесь, что коллекция заполнена, иначе ORM не знает, какие сущности следует каскадно удалить.

Попробуйте это так:

export default class BusinessData {
  public async delete(id: string): Promise<number> {
    const business = await this.businessRepository.findOne(id, ['locations'])
    return await this.businessRepository.remove(business);
  }
}

Ваш подход с удалением по идентификатору будет работать только в том случае, если объект уже был загружен в карту идентификации (она же управляется EM), включая locationsколлекция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...