Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unnecessary inserting entity after deleting it #4863

Closed
vitaliy-art opened this issue Oct 22, 2023 · 0 comments
Closed

Unnecessary inserting entity after deleting it #4863

vitaliy-art opened this issue Oct 22, 2023 · 0 comments

Comments

@vitaliy-art
Copy link

Describe the bug
I described three entities, one of them is owned by others via @ManyToOne attribute. Then i create first entity, create second entity and create third entity, owned by first two. Then i delete first entity, update second entity and delete second entity. I expects that all entities is deleted from database, but before update second entity entity manager creates first entity again. And after all this steps i have in database first entity which was deleted.

Stack trace
There is no errors in stack trace.

To Reproduce
Steps to reproduce the behavior:

import { MikroORM, defineConfig } from '@mikro-orm/sqlite';
import { Entity, Property, PrimaryKey, ManyToOne, Cascade } from '@mikro-orm/core';

@Entity()
class Department {
    @PrimaryKey()
    public id!: number;

    @Property()
    public name!: string;
}

@Entity()
class Person {
    @PrimaryKey()
    public id!: number;

    @Property()
    public name!: string;
}

@Entity()
class Employee {
    @PrimaryKey()
    public id!: number;

    @ManyToOne({ onDelete: 'cascade' })
    public department!: Department;

    @ManyToOne({ onDelete: 'cascade' })
    public person!: Person;
}

(async () => {
    const config = defineConfig({
        entities: [Department, Person, Employee],
        dbName: 'db.bd',
        type: 'sqlite',
        allowGlobalContext: true,
        driverOptions: {
            'foreign_keys': 'ON',
        },
        debug: true,
    });

    const orm = await MikroORM.init(config);
    await orm.schema.updateSchema();
    const em = orm.em;

    const dep = new Department();
    dep.name = 'Department';
    await em.persistAndFlush(dep);

    const per = new Person();
    per.name = 'Person';
    await em.persistAndFlush(per);

    const emp = new Employee();
    emp.department = dep;
    emp.person = per;
    await em.persistAndFlush(emp);

    await em.removeAndFlush(dep);

    per.name = 'New Person';
    await em.persistAndFlush(per);
    await em.removeAndFlush(per);
    await orm.close();
})();

Starting log

Debugger attached.
[info] MikroORM version: 5.8.10
[discovery] ORM entity discovery started, using ReflectMetadataProvider
[discovery] - processing entity Department
[discovery] - processing entity Person
[discovery] - processing entity Employee
[discovery] - entity discovery finished, found 3 entities, took 19 ms
[info] MikroORM successfully connected to database db.bd
[query] select name as table_name from sqlite_master where type = 'table' and name != 'sqlite_sequence' and name != 'geometry_columns' and name != 'spatial_ref_sys' union all select name as table_name from sqlite_temp_master where type = 'table' order by name [took 8 ms, 0 result]
[query] pragma foreign_keys = off; [took 0 ms, 0 result]
[query] create table `department` (`id` integer not null primary key autoincrement, `name` text not null); [took 14 ms, 0 result]
[query] create table `person` (`id` integer not null primary key autoincrement, `name` text not null); [took 15 ms, 0 result]
[query] create table `employee` (`id` integer not null primary key autoincrement, `department_id` integer null, `person_id` integer null, constraint `employee_department_id_foreign` foreign key(`department_id`) references `department`(`id`) on delete cascade on update cascade, constraint `employee_person_id_foreign` foreign key(`person_id`) references `person`(`id`) on delete cascade on update cascade); [took 16 ms, 0 result]
[query] create index `employee_department_id_index` on `employee` (`department_id`); [took 16 ms, 0 result]
[query] create index `employee_person_id_index` on `employee` (`person_id`); [took 15 ms, 0 result]
[query] pragma foreign_keys = on; [took 0 ms, 0 result]

Expected log

[query] begin
[query] insert into `department` (`name`) values ('Department') returning `id` [took 8 ms]
[query] commit
[query] begin
[query] insert into `person` (`name`) values ('Person') returning `id` [took 7 ms]
[query] commit
[query] begin
[query] insert into `employee` (`department_id`, `person_id`) values (8, 8) returning `id` [took 11 ms]
[query] commit
[query] begin
[query] delete from `department` where `id` in (8) [took 12 ms]
[query] commit
[query] begin
[query] update `person` set `name` = 'New Person' where `id` = 8 [took 1 ms]
[query] commit
[query] begin
[query] delete from `person` where `id` in (8) [took 6 ms]
[query] commit
Debugger detached.

Actual log

[query] begin
[query] insert into `department` (`name`) values ('Department') returning `id` [took 7 ms]
[query] commit
[query] begin
[query] insert into `person` (`name`) values ('Person') returning `id` [took 10 ms]
[query] commit
[query] begin
[query] insert into `employee` (`department_id`, `person_id`) values (1, 1) returning `id` [took 11 ms]
[query] commit
[query] begin
[query] delete from `department` where `id` in (1) [took 9 ms]
[query] commit
[query] begin

> [query] insert into `department` (`id`, `name`) values (1, 'Department') returning `id` [took 6 ms]

[query] update `person` set `name` = 'New Person' where `id` = 1 [took 1 ms]
[query] commit
[query] begin
[query] delete from `person` where `id` in (1) [took 10 ms]
[query] commit
Debugger detached.

Versions

Dependency Version
node v20.6.1
typescript 5.2.2
mikro-orm 5.8.10
sqlite3 5.1.6
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant