반응형
[NotMapped]란?
해당 어노테이션이 들려있다면 이는 EF의 모델과 데이터베이스 간 매핑 대상에서 제외한다는 뜻이다.
- DB 테이블에는 존재하지 않음
- EF가 이 속성을 INSERT/SELECT/UPDATE에 포함하지 않음
- 계산용, 임시 상태 저장용, DTO 전용 속성등으로 사용된다.
[NotMapped]
public SomeType SomeProperty { get; set; }
대표적인 사용 예시
- FirstName, LastName은 각각 string 컬럼으로 DB에 생성되지만 FullName은 DB에 생성되지 않는다.
- 코드에서 자유롭게 사용되고 특정한 용도로 활용된다.
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
[NotMapped]
public string FullName => $"{FirstName} {LastName}";
}
모델에는 있지만 DB에는 없는 값 (예: JSON 변환용 객체)
[NotMapped]
public Dictionary<string, object> ExtraMetadata { get; set; }
내부 동작 설명
- EF는 모델 클래스의 모든 public 속성을 자동으로 매핑 대상으로 간주한다.
- [NotMapped]를 붙이면 해당 속성을 ModelBuilder에서 무시하게 된다.
- Fluent API의 .Ignore()도 동일한 동작을 수행한다.
modelBuilder.Entity<User>().Ignore(u => u.FullName);
사용시 주의할 점
- [NotMapped] 속성을 가진 객체가 가진 필드도 전부 기록되지 않는다.
- [NotMapped] 속성은 EF를 이외에서는 작동하지 않는다. (JSON 직렬화, MVC 모델 바인등 등)
- DB 컬럼이 실제로 존재할 경우 에러는 나지 않지만 EF가 읽지도, 쓰지도 않음
그럼에도 불구하고 [NotMapped]속성을 가진 객체를 DB에 저장하고 싶을때
- 저장 시 > Profile 객체를 JSON 문자열로 변환해서 DB에 저장
- 조회 시 > JSON 문자열을 Profile 객체로 복원
- 개발자가 신경 쓸 필요 없음
[NotMapped]
class Player
{
public string Name { get; set; }
public string Address { get; set; }
}
[EntityTypeConfiguration(typeof(PlayerConfiguration))]
class PlayerData
{
[Column(TypeName = "bytes")]
public Player { get; set; }
}
class PlayerConfiguration : IEntityTypeConfiguration<PlayerDocument>
{
builder.Property(e => e.player).HasConversion(
v => JsonSerializer.Serialize(v, (JsonSerializerOption?)null),
v => JsonSerializer.Deserialize<Player>(v) ?? new Player());
}
'프로그래밍 > C#' 카테고리의 다른 글
C# record에 대해서 알아보자 (0) | 2025.04.26 |
---|---|
C# is 패턴 매칭(Pattern Matching)에 대해서 알아보자 (0) | 2025.04.26 |
JWT를 활용해서 C# 서버에서 사용자 인증 처리하기 (0) | 2025.04.23 |
ASP.NET Core HTTP 요청 처리 흐름 알아보기 (0) | 2025.04.23 |
C# 환경변수로 appsettings.json 값 덮어쓰기 (0) | 2025.04.12 |
댓글