Shadow Property & Backing Field

Eunho Bae·2022년 7월 1일
0

Shadow Property

Entity class에는 있지만 DB에는 없도록 설정하고 싶으면 [NotMapped] or .Ignore()을 이용했다.

이번에는 DB에는 존재하지만 Class에는 없도록 설정하도록 하고 싶으면 어떻게 하는지 알아보자

        protected override void OnModelCreating(ModelBuilder builder)
        {
      		builder.Entity<Item>().Property<DateTime>("RecoveredDate");
        }

위 코드로 세팅해주면 DB의 Item에 새로운 열이 추가된 것을 볼 수 있다.

getter/setter

DB에 접근해서 첫번째 행에 접근하여 'RecoveredDate'라는 이름의 property를 가져오거나 설정하는 코드이다.

     db.Entry(items[0]).Property("RecoveredDate").CurrentValue = DateTime.Now;

	...

     db.SaveChanges();

Backing Field (EF Core)

private field(_jsonData)를 DB에 매핑하고 public getter로 가공해서 사용

예를들어, 게임에서 키세팅을 하는데 하나씩 테이블마다 column을 만들기는 버거우니까 json형태의 string으로 한번에 묶어서 DB에 저장하고, 필요할 때 json을 파싱해서 사용할 수 있다.

일반적으로 Fluent API를 사용

DbCommands

    items[0].SetOption(new ItemOption() { dex = 1, hp = 2, str = 3 });

DataModel

public struct ItemOption
    {
        public int str;
        public int dex;
        public int hp;
    }
    
    [Table("Item")]
    public class Item
    {
        private string _jsonData;
        public string JsonData 
        { 
            get { return _jsonData; } 
        }

        public void SetOption(ItemOption option)
        {
            _jsonData = JsonConvert.SerializeObject(option);
        }

        public ItemOption GetOption()
        {
            return JsonConvert.DeserializeObject<ItemOption>(_jsonData);
        }

AppDbContext

			// backing field
            builder.Entity<Item>()
                .Property(i => i.JsonData)
                .HasField("_jsonData"); // private string _jsonData;

JsonData에서 setter가 있어야 Item에 JsonData 열이 추가되지만 setter가 private이거나 없을 때 위와 같이 SetOption, GetOption을 정의해서 사용하면 안전하게 구현할 수 있다. 하지만 열이 추가되지 않기 때문에 JsonData와 _jsonData를 연동시켜주는 코드를 작성해주면 된다.

profile
개인 공부 정리

0개의 댓글