EF Core : Insert or Update violates FK not null constraint μ—λŸ¬

두 개의 1:N 관계λ₯Ό λ§ΊλŠ” 객체가 μžˆμŠ΅λ‹ˆλ‹€.
Team:n - 1:Worker : κ΄€λ¦¬μž
Team:1 - n:Worker : μ†Œμ†

// μŠˆλ„ μ½”λ“œ
class Team
{
    Worker? Manger;
    Worker[] Member; 
}

class Worker
{
    Team? Team;
    Team[] Managings;
}
// IEntityModelConfiguration<Team>

// κ΄€λ¦¬μž 관계
builder.HasOne( x => x.Manager)
.WithMany( x => Managings)
.IsRequired(false)
.OnDelete(DeleteBehavior.SetNull);

// μ†Œμ† 관계
builder.HasMany( x => x.Members)
.WithOne(x=>x.Team)
.IsRequied(false)
.OnDelete(DeleteBehavior.SetNull);

EF λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ—…λ°μ΄νŠΈ 후에, 각 ν…Œμ΄λΈ”μ— foreign key κ°€ 각각 잘 λ“€μ–΄κ°€ μžˆμŠ΅λ‹ˆλ‹€.

teams.manager_id
workers.team_id

그런데, λ¬Έμ œλŠ” μ•„λž˜μ˜ μ½”λ“œμ—μ„œ,

dbcontext.Workers.Add( new Worker(){ Team = new Team(), } );
dbcontext.SaveChanges();

Worker ν…Œμ΄λΈ”μ˜ Insert, Update μ‹œμ— ForeignKey Not Null constraint μœ„λ°˜ν–ˆλ‹€λŠ” μ—λŸ¬κ°€ λ‚©λ‹ˆλ‹€.

참고둜, 이 μ—λŸ¬μ— μ•žμ„œ, κ°‘μžκΈ° Worker ν…Œμ΄λΈ”μ˜ Id 에 λŒ€ν•΄ Primary Key Not Null constraint μœ„λ°˜ν–ˆλ‹€λŠ” μ—λŸ¬κ°€ λ‚˜μ„œ,

builder.Property( x => x.Id)
.IsRequired()
.ValueGeneratedOnAdd() // Postgresql의 ν™•μž₯ ν•¨μˆ˜ uuid-ossp() μ‚¬μš©.

builder.HasKey( x=> x.Id);

λ₯Ό μ•„λž˜λ‘œ λŒ€μ²΄ν•˜μ—¬,

builder.Property( x => x.Id)
.IsRequired()
//.ValueGeneratedOnAdd() // Postgresql의 ν™•μž₯ ν•¨μˆ˜ uuid-ossp() μ‚¬μš©.
.HasDefaultValueSql("gen_random_uuid()") // Postgresql 의 빌트인 V4 Guid μƒμ„±ν•¨μˆ˜

PK μ—λŸ¬λŠ” μ—†μ–΄μ‘ŒλŠ”λ°, λœ¬κΈˆμ—†μ΄ FK κ°€ μ΄μ–΄μ§€λ„€μš”.

잘 λ˜λ‹€κ°€ κ°‘μžκΈ° μ—λŸ¬κ°€ ν„°μ§€λŠ” λ°”λžŒμ— λ©˜λΆ• 온 μƒνƒœμž…λ‹ˆλ‹€.

DB κ³ μˆ˜λ‹˜λ“€μ˜ μ‘°μ–Έ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.

1개의 μ’‹μ•„μš”

λ‹·λ„· λ¬Έμ„œλ‚˜ μŠ€νƒ μ˜€λ²„ν”Œλ‘œμš°μ—μ„œλŠ” μ–‘λ°©ν–₯ oneTomany κ°€ κ°€λŠ₯ν•˜λ‹€κ³  ν•˜μ§€λ§Œ, μ‹€μ œλ‘œλŠ” λ˜μ§€κ°€ μ•Šλ„€μš”.

κ·Έλž˜μ„œ λ³„λ„μ˜ 우회 객체λ₯Ό λ§Œλ“€μ–΄ 삼각 관계λ₯Ό λ§Œλ“€μ–΄μ„œ ꡐ톡 정리λ₯Ό ν–ˆμŠ΅λ‹ˆλ‹€.

Worker ----∈ Manager β€”βˆˆ Team β€”βˆˆ Worker

1개의 μ’‹μ•„μš”