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
'공부 > EFCore' 카테고리의 다른 글
[EFCore] 상속 관계를 매핑해보자 : Table Per Hierarchy (THP) 만들기 (0) | 2022.09.08 |
---|---|
[EFCore] Entity와 DB, Table 연동하기 (0) | 2022.09.07 |
[EFCore] 다수의 Navigational Property가 같은 클래스를 참조하는 상황, 어떻게 대처할까 (0) | 2022.09.07 |
[EFCore] Convention을 알아보자 (0) | 2022.09.06 |
[EFCore] 데이터를 임시로 삭제해보자 : Soft Delete (HasQueryFilter/IgnoreQueryFilter) (0) | 2022.09.06 |