for some reason my GORM is trying to save a nil relation to the database as a zero struct and is then running into foreign key errors, because the foreign key ID is 0 (does not exist).
I have the following model definitions:
type Member struct {
gorm.Model
EmployerID *uint `json:"employer_id,omitempty"`
Employer Employer `json:"employer"`
}
type Employer struct {
gorm.Model
CompanyID uint `json:"company_id"`
Company *Company `json:"company"`
ExternalPayrollCompanyID *uint `json:"external_payroll_company_id,omitempty"`
ExternalPayrollCompany *Company `json:"external_payroll_company,omitempty"`
}
type Company struct {
gorm.Model
AddressID uint `json:"address_id,omitempty"`
Address *Address `json:"address,omitempty"`
}
type Address struct {
gorm.Model
StreetNr string `gorm:"type:varchar(600);not null" json:"street_nr,omitempty"`
ZipCode uint `gorm:"type:int;not null" json:"zip_code,omitempty"`
City string `gorm:"type:varchar(600);not null" json:"city,omitempty"`
}
As you can see, an Employer always has a Company, and possibly an ExternalPayrollCompany. If a Company exists, it always has an Address.
I have a unit test, in which an Employer has a set Company, but a nil ExternalPayrollCompany. When I Create it in the database, GORM acts as expected (the ExternalPayrollCompany-ID is NULL, and no "empty" Company is created):
employer := Employer{
Company: &Company{
Name: "123",
Address: &Address{
StreetNr: "Asdf 13",
ZipCode: 69999,
City: "Asdf",
},
},
}
db.Create(employer)
However, when the Employer is nested in a parent Member model:
member := Member{
Employer: Employer{
Company: &Company{
Name: "123",
Address: &Address{
StreetNr: "Asdf 13",
ZipCode: 69999,
City: "Asdf",
},
},
},
}
db.Create(member)
then the nil value for ExternalPayrollCompany is ignored, an empty Company with an AddressID of 0 is inserted, and the DB engine complains about a foreign key error, since no Address with ID 0 exists.
It would also appear that GORM is initializing the ExternalPayrollCompany and then setting the timestamps, as the following is output in the debug mode:
INSERT INTO [companies] ([created_at],[updated_at],[name],[address_id]) OUTPUT Inserted.[id] VALUES ('2020-05-10 15:46:05','2020-05-10 15:46:05','',0)
I disabled the timestamp callback to no effect:
db.Callback().Create().Remove("gorm:update_time_stamp")
I would appreciate any input, since I am running out of ideas!