DataBase/PostgreSQL

EF Core Owned Entity - Delete 에러

검은고양이개발자 2025. 4. 1. 16:34
반응형

🔍 EF Core에서 Owned Entity 삭제가 안 될 때? Include()가 핵심이었다!

최근 EF Core로 개발을 하다가 꽤 당황스러운 이슈를 겪었습니다.
Owned Entity인 AlarmAction을 null로 설정했는데, DB에서는 값이 전혀 지워지지 않더라구요.

 
alarmSchedule.AlarmAction = null; await context.SaveChangesAsync();

 

확실히 AlarmAction을 null로 만들었고, 저장도 했는데…
DB에는 여전히 데이터가 남아있었습니다. 왜일까요?


🧠 문제 상황 요약

  • AlarmAction은 AlarmSchedule의 Owned Entity
  • insert나 update는 잘 되는데,
  • null로 만들고 save해도 삭제가 반영되지 않음

❗ 원인: Include() 없이 삭제 시, EF는 Owned Entity를 추적하지 못함

EF Core는 Owned Entity를 삭제할 때,
기존 값을 Change Tracker로 추적하고 있어야 삭제 여부를 감지할 수 있습니다.

하지만 아래처럼 Include 없이 가져오면?

 
var alarmSchedule = await context.AlarmSchedules .FirstOrDefaultAsync(x => x.Code == "AS001"); 
alarmSchedule.AlarmAction = null; 
context.Update(alarmSchedule); 
await context.SaveChangesAsync(); // ❌
 
AlarmAction은 여전히 DB에 남아있음!

EF는 AlarmAction을 로딩하지 않았기 때문에,
"아, AlarmAction이 null로 바뀌었구나"를 알 수 없습니다.


✅ 해결 방법: 반드시 Include(x => x.AlarmAction) 해줘야 한다!

 
var alarmSchedule = await context.AlarmSchedules .Include(x => x.AlarmAction)
.FirstOrDefaultAsync(x => x.Code == "AS001");
alarmSchedule.AlarmAction = null; 
context.Update(alarmSchedule); 
await context.SaveChangesAsync();
 // ✅ DB에서도 AlarmAction 컬럼 값이 제거됨!

💡 왜 Insert/Update는 되는데 Delete는 안 될까?

작업Include 없이도 가능?이유
Insert ✅ 가능 새 값이므로 비교할 이전 상태가 없음
Update ✅ 가능 전체 값을 통째로 바꾸기 때문
Delete (null 처리) ❌ 안 됨 기존 값을 추적해야 삭제 여부를 인식함

✅ 결론

EF Core에서 Owned Entity를 null로 설정해서 삭제하려면,

반드시 Include(...)로 로딩해서 EF가 해당 값을 추적하게 만들어야 합니다.

 

반응형