// State
// Detached (no tracking 상태. SaveChanges해도 존재조차 모른다.)
// Unchanged (DB에서 관리하고 있는 데이터와 메모리에서 관리되는 데이터 차이 X. 수정사항 없음. SaveChanges해도 변화 없음)
// Deleted (DB에는 아직 있지만, 삭제되어야 하는 상태. 메모리에서는 삭제한 상태. SaveChanged를 이용해 DB에서도 삭제되도록 해야함)
// Modified (DB에 있고, 클라(메모리)에서 수정된 상태. SaveChanges로 DB에 적용)
// Added (DB에는 아직 없고 메모리에는 있기 떄문에, SaveChanges로 DB에 추가)
// SaveChanges 호출하면 일어나는 일들
// 1) 추가된 객체들의 상태가 Unchanged로 변경
// 2) SQL Identity로 주요키를 관리
// - 데이터 추가 후 ID를 받아와서 객체의 ID 프로퍼티를 채워줌
// - Relationship 참고해서 외래키 세팅 및 객체 참조 연결
public static void CreateTestData(AppDbContext db)
{
var strevelun = new Player() { Name = "Strevelun" };
var rookiss = new Player() { Name = "Rookiss" };
var faker = new Player() { Name = "faker" };
// Detached
Console.WriteLine(db.Entry(rookiss).State);
List<Item> items = new List<Item>()
{
new Item()
{
TemplateId = 101,
CreateDate = DateTime.Now,
Owner = strevelun,
},
new Item()
{
TemplateId = 102,
CreateDate = DateTime.Now,
Owner = rookiss,
},
new Item()
{
TemplateId = 103,
CreateDate = DateTime.Now,
Owner = faker,
}
};
Guild guild = new Guild()
{
GuildName = "T1",
Members = new List<Player>() { strevelun, rookiss, faker }
};
db.Items.AddRange(items);
db.Guilds.Add(guild);
// Added. new Item()과 Members에 rookiss를 넣기 떄문에 Added
Console.WriteLine(db.Entry(rookiss).State);
db.SaveChanges();
// Unchanged
Console.WriteLine(db.Entry(rookiss).State);
}
var owner = db.Players.Where(p => p.Name == "Rookiss").First();
Item item = new Item()
{
TemplateId = 300,
CreateDate = DateTime.Now,
Owner = owner
};
db.Items.Add(item);
db.SaveChanges();
1) Tracked Instance(추적되고 있는 객체)를 얻어옴. 위 코드에서 Rookiss 이름을 가진 Player 객체를 얻어와서 owner에 넣어줌.
2) 데이터 연결. Item 객체를 하나 만들고 Item 객체의 외래키인 Player Owner에 방금 얻어온 Player 객체인 owner를 할당시켜준 후 DB의 Items에 넣어주었음.