2014-04-17 21 views
8

Mam Product tabelę z następującymi kolumnami [id, name, CategoryId] i Category tabeli z modelu [id, name]Sequelize.js onDelete: 'Kaskada' nie usuwa rekordy sequelize

produktu: -

module.exports = function(sequelize, DataTypes) { 
    var Product = sequelize.define('Product', { 
    name: DataTypes.STRING 
    }, { 
    associate: function(models) { 
     Product.belongsTo(models.Category); 
    } 
    }); 
    return Product 
} 

Kategoria Model: -

module.exports = function(sequelize, DataTypes) { 
    var Category = sequelize.define('Category', { 
    name: { type: DataTypes.STRING, allowNull: false } 
    }, { 
    associate: function(models) { 
     Category.hasMany(models.Product, { onDelete: 'cascade' }); 
    } 
    }); 
    return Category 
} 

po usunięciu kategorii usuwa tylko kategorię, a nie odpowiadające jej produkty. Nie wiem, dlaczego tak się dzieje?

zmiana: Sequelize Wersja sequelize 1.7.0

==================================== ============================================ Odpowiedź (W jaki sposób to mam stałe): -.

I dokonał tego poprzez dodanie ograniczenia w bazie danych za pomocą polecenia Alter, jak Add Foreign Key Constraint przez migration jest otwarty bug w sequelize.

ALTER TABLE "Products" 
ADD CONSTRAINT "Products_CategoryId_fkey" FOREIGN KEY ("CategoryId") 
REFERENCES "Categories" (id) MATCH SIMPLE 
ON DELETE CASCADE 
+1

Whats wyjściu sequelize.sync? Czy dodaje klucz obcy z ograniczeniem usunięcia? W której wersji jesteś? –

+0

@JanAagaardMeier Tabela produktów zawiera kolumnę 'CategoryId', ale ograniczenie klucza obcego nie jest dodawane. jak dodać klucz obcy z ograniczeniem usuwania? –

+1

Czy muszę dodać migrację dla dodania ograniczenia klucza obcego? –

Odpowiedz

18

Uważam, że należy umieścić onDelete w modelu kategorii zamiast w modelu produktów.

module.exports = function(sequelize, DataTypes) { 
    var Category = sequelize.define('Category', { 
    name: { type: DataTypes.STRING, allowNull: false } 
    }, { 
    associate: function(models) { 
     Category.hasMany(models.Product, { onDelete: 'cascade' }); 
    } 
    }); 
    return Category 
} 
+1

Dzięki @agchou :) –

+0

@Sampat Anytime! – agchou

+0

to nie działało dla mnie, dopóki nie dodałem 'hooks: true' również. Nie jestem pewien, czy to błąd, czy projekt. – redbmk

6

dzień „sequelize”: „^ 3.5.1”, to działa tylko wtedy, gdy można umieścić onDelete='CASCADE' w deklaracji belongsTo, który jest modelem w Twoim przypadku Product. Jest to sprzeczne z dokumentacją: http://sequelize.readthedocs.org/en/latest/api/associations/index.html?highlight=onDelete#hasmanytarget-options

Proszę zobaczyć to pytanie: Sequelize onDelete not working

+3

To zadziałało dla mnie z hasMany(), ale musiałem dodać "hooks: true" do opcji. Podobnie jak User.hasOne (Profile, {onDelete: 'cascade', hooks: true}) –

+1

Podobnie jak @SoichiHayashi, '{onDelete: 'cascade', hooks: true}' w stowarzyszeniu 'hasMany' pracował dla mnie. Jestem na Sequelize "3.30". Posiadanie skojarzeń odwrotnie sprawiło mi pewne problemy. – RYS