본문 바로가기
프로그래밍/C#

Entity Framework에서 [NotMapped] 속성

by bantomak 2025. 4. 26.
반응형

[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());
}

댓글