Я использую микро-орм с 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() [took 0 ms]
Нет, я не удалил часть where и предоставил значение для параметра id. Изменение кода на: public async delete(id: string): Promise<number> { // tslint:disable-next-line: no-console console.info(id); return await this.businessRepository.remove(id); }
Вот вывод после обнаружения объекта, ничего не удаляя: 5cac818273243d1439866227 [query-logger] db.getCollection("business").deleteMany() [took 0 ms]
Только что проверил код, его нет только в логгере запросов, условие не пропускается при запросе к БД. Исправлю как можно скорее, выглядит довольно страшно :]
Каскады работают на уровне приложений, поэтому для всех драйверов, включая mongo.
Проблема здесь в том, что вы удаляете объект Business
по идентификатору. Вам нужно удалить его по ссылке — укажите сущность и убедитесь, что у вас заполнена коллекция, иначе 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);
}
}
Ваш подход с удалением по id будет работать только в том случае, если сущность уже загружена в карту идентификации (она же управляется EM), включая коллекцию locations
.
Да, это работает. Спасибо (надеюсь не сильно напрягаю)
Точно нет! Спасибо за хорошие вопросы! Я сделаю страницу часто задаваемых вопросов, основанную на них в ближайшем будущем.
Просто любопытно - вы действительно получили это из регистратора запросов или удалили часть where? Если да, то уверены ли вы, что указываете значение параметра
id
?