공부/EFCore

[EFCore] Shadow Property와 Backing Field

돌멩이수프 2022. 9. 7. 16:39
728x90

 

Shadow Property

class에는 있지만 DB에는 데이터가 없는 경우, [NotMapped] 혹은 .Ignore()로 해결한다. 반대로 DB에는 데이터가 있지만 class에는 없는 경우를 Shadow Property라고 한다.

Shadow Property를 생성할 때는 .Property<프로퍼티형식>("프로퍼티이름") 으로 한다.

접근할때는 .Property("프로퍼티이름").CurrentValue로 한다.

 

망가진 아이템을 고친 날짜를 Shadow Property로 만들고 싶다고 하면, 우선 Data 생성란에 RecoveredDate를 추가해준다.

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

 

AppDbContext에도 내용을 추가해준다.

builder.Entity<Item>().Property<DateTime>("RecoveredDate");

 

성공적으로 날짜가 생겼다. 밑에 있는 데이터는 생성하지 않은 상태여서 요상하다.

 

 

Backing Field

private field를 DB에 맵핑하고 public getter로 가공해서 사용하고자 하는 상황을 Backing Field라고 한다.

ItemOption을 새로 생성해주는 상황이라 해보자.

 

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에도 내용을 추가한다.

 

builder.Entity<Item>()
	.Property(i => i.JsonData)
	.HasField("_jsonData");

 

데이터 생성란에도 내용을 추가한다.

 

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

 

 

정상적으로 데이터가 추가됐다. private로 생성된 데이터를 public get, set으로 뽑아와서 사용할 수 있다. 굳.

728x90