Entity class에는 있지만 DB에는 없도록 설정하고 싶으면 [NotMapped] or .Ignore()을 이용했다.
이번에는 DB에는 존재하지만 Class에는 없도록 설정하도록 하고 싶으면 어떻게 하는지 알아보자
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Item>().Property<DateTime>("RecoveredDate");
}
위 코드로 세팅해주면 DB의 Item에 새로운 열이 추가된 것을 볼 수 있다.
DB에 접근해서 첫번째 행에 접근하여 'RecoveredDate'라는 이름의 property를 가져오거나 설정하는 코드이다.
db.Entry(items[0]).Property("RecoveredDate").CurrentValue = DateTime.Now;
...
db.SaveChanges();
private field(_jsonData)를 DB에 매핑하고 public getter로 가공해서 사용
예를들어, 게임에서 키세팅을 하는데 하나씩 테이블마다 column을 만들기는 버거우니까 json형태의 string으로 한번에 묶어서 DB에 저장하고, 필요할 때 json을 파싱해서 사용할 수 있다.
일반적으로 Fluent API를 사용
items[0].SetOption(new ItemOption() { dex = 1, hp = 2, str = 3 });
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);
}
// backing field
builder.Entity<Item>()
.Property(i => i.JsonData)
.HasField("_jsonData"); // private string _jsonData;
JsonData에서 setter가 있어야 Item에 JsonData 열이 추가되지만 setter가 private이거나 없을 때 위와 같이 SetOption, GetOption을 정의해서 사용하면 안전하게 구현할 수 있다. 하지만 열이 추가되지 않기 때문에 JsonData와 _jsonData를 연동시켜주는 코드를 작성해주면 된다.