diff --git a/association.go b/association.go index 0f2102f7..7adb8c91 100644 --- a/association.go +++ b/association.go @@ -118,7 +118,7 @@ func (association *Association) Replace(values ...interface{}) error { if _, pvs := schema.GetIdentityFieldValuesMap(reflectValue, primaryFields); len(pvs) > 0 { column, values := schema.ToQueryValues(rel.FieldSchema.Table, foreignKeys, pvs) - tx.Where(clause.IN{Column: column, Values: values}).UpdateColumns(updateMap) + association.Error = tx.Where(clause.IN{Column: column, Values: values}).UpdateColumns(updateMap).Error } case schema.Many2Many: var ( @@ -154,7 +154,7 @@ func (association *Association) Replace(values ...interface{}) error { tx.Where(clause.Not(clause.IN{Column: relColumn, Values: relValues})) } - tx.Delete(modelValue) + association.Error = tx.Delete(modelValue).Error } } return association.Error diff --git a/tests/associations_test.go b/tests/associations_test.go index c1a4e2b2..5279cec0 100644 --- a/tests/associations_test.go +++ b/tests/associations_test.go @@ -3,6 +3,7 @@ package tests_test import ( "testing" + "gorm.io/gorm" . "gorm.io/gorm/utils/tests" ) @@ -32,6 +33,41 @@ func TestInvalidAssociation(t *testing.T) { } } +func TestAssociationNotNullClear(t *testing.T) { + type CreditCard struct { + gorm.Model + Number string + UserID uint `gorm:"not null"` + } + + type User struct { + gorm.Model + CreditCards []CreditCard + } + + DB.Migrator().DropTable(&User{}, &CreditCard{}) + + if err := DB.AutoMigrate(&User{}, &CreditCard{}); err != nil { + t.Fatalf("Failed to migrate, got error: %v", err) + } + + user := &User{ + CreditCards: []CreditCard{{ + Number: "1", + }, { + Number: "2", + }}, + } + + if err := DB.Create(&user).Error; err != nil { + t.Fatalf("Failed to create test data, got error: %v", err) + } + + if err := DB.Model(user).Association("CreditCards").Clear(); err == nil { + t.Fatalf("No error occured during clearind not null association") + } +} + func TestForeignKeyConstraints(t *testing.T) { type Profile struct { ID uint