2014-04-17 10 views
8

Ich habe Product Tabelle mit Spalten folgende [id, name, CategoryId] und Category Tabelle mit [id, name]Sequelize.js onDelete: 'Kaskade' nicht Löschen von Datensätzen sequelize

Produkt-Modell: -

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

Kategorie Modell: -

Wenn ich Kategorie lösche, löscht es Kategorie nur nicht die entsprechenden Produkte damit verbunden. Ich weiß nicht, warum das passiert?

Update: Sequelize Version sequelize 1.7.0

==================================== ======================================== Antwort (Wie diese I fest): -.

I erreicht dies durch Einschränkung für Datenbank mit Alter Befehl das Hinzufügen, als Add Foreign Key Constraintmigration durch eine offene bug in sequelize.

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

Was ist die Ausgabe von sequelize.sync? Fügt es einen Fremdschlüssel mit einer On-Delete-Einschränkung hinzu? In welcher Version bist du? –

+0

@JanAagaardMeier Die Produkttabelle hat die Spalte 'CategoryId', die Bedingung für den Fremdschlüssel ist jedoch nicht hinzugefügt. Wie füge ich einen Fremdschlüssel mit der Löschbedingung hinzu? –

+1

Muss ich eine Migration hinzufügen, um eine Fremdschlüsseleinschränkung hinzuzufügen? –

Antwort

18

Ich glaube, dass Sie das onDelete in das Kategorie-Modell statt in das Produktmodell einfügen sollen.

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

Danke @agchou :) –

+0

@Sampat Jederzeit! – agchou

+0

das hat nicht funktioniert, bis ich 'hooks: true' hinzugefügt habe. Ich bin mir nicht sicher, ob das ein Bug oder Design ist. – redbmk

6

Ab "sequelize": "^ 3.5.1", es funktioniert nur, wenn Sie onDelete='CASCADE' in der belongsTo Erklärung setzen, die das Product Modell in Ihrem Fall ist. Dies widerspricht den docs: http://sequelize.readthedocs.org/en/latest/api/associations/index.html?highlight=onDelete#hasmanytarget-options

Bitte diese Frage sehen: Sequelize onDelete not working

+3

Es funktionierte gut für mich mit hasMany(), aber ich musste "hooks: true" zu der Option hinzufügen. Wie User.hasOne (Profil, {onDelete: 'cascade', hooks: true}) –

+1

Wie @SoichiHayashi, '{onDelete: 'cascade', hooks: true}' auf der 'hasMany'-Verknüpfung funktionierte für mich. Ich bin auf Sequelize "3.30". Die umgekehrten Assoziationen haben mir tatsächlich Probleme bereitet. – RYS

Verwandte Themen