[EF Core] Property Setter를 호출하는 법

개요

Entity Framework를 사용하면서 특정 property 값에 전처리를 위해 setter 내부에서 특정 동작을 하도록 하였으나 정상적으로 동작하지 않았다.

확인 해보니 EF Core는 내부적으로 backing field를 사용하여 property가 아닌 field로 접근을 할 수 있는 것이다. 엔티티가 생성 된 후 엔티티를 업데이트 하는 경우에만 Property에 접근이 이루어지고, Property가 읽기 접근이거나 업데이트가 없으면 backing field를 계속 사용한다.

해결법

EF Core에서 모델을 빌드할 때 backing field 대신 Property를 사용 할 것이라고 알린다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<User>(eb => {
            eb.HasNoKey();
            eb.Property(u => u.Name)
            .HasField("_name")
            .UsePropertyAccessMode(PropertyAccessMode.Property);
        });
}

또한 아래 방법으로 모든 Property에 대해 적용할 수 있다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.UsePropertyAccessMode(PropertyAccessMode.Property)
        .Entity<User>(eb => eb.HasNoKey());
}