Entity 상태 관리

Eunho Bae·2022년 6월 30일
0

State


        // 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에 넣어주었음.

profile
개인 공부 정리

0개의 댓글