반응형
🔍 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가 해당 값을 추적하게 만들어야 합니다.
반응형
'DataBase > PostgreSQL' 카테고리의 다른 글
EF Core 마이그레이션 재설정 및 재적용 방법 (0) | 2025.03.31 |
---|---|
PostgreSQL 외부 IP에서 연결 설정 방법 (0) | 2025.01.11 |
PostgreSQL pgAdmin에서 테이블 백업(backUP) 방법 (0) | 2024.10.21 |
PostgreSQL에 대한 장단점 및 설명 (0) | 2024.01.17 |