CRUD 실습

Eunho Bae·2022년 6월 30일
0

코드 변경

DbCommands

 public class DbCommands
    {
        public static void InitializeDB(bool forceReset = false)
        {
            using (AppDbContext db = new AppDbContext())
            {
                if (!forceReset && (db.GetService<IDatabaseCreator>() as RelationalDatabaseCreator).Exists())
                    return;

                db.Database.EnsureDeleted();
                db.Database.EnsureCreated();

                CreateTestData(db);
                Console.WriteLine("DB Initialized!");
            }
        }

        public static void CreateTestData(AppDbContext db)
        {
            var player = new Player()
            {
                Name = "Strevelun"
            };

            List<Item> items = new List<Item>()
            {
                new Item()
                {
                    TemplateId = 101,
                    CreateDate = DateTime.Now,
                    Owner = player,
                },
                new Item()
                {
                    TemplateId = 102,
                    CreateDate = DateTime.Now,
                    Owner = player,
                },
                new Item()
                {
                    TemplateId = 103,
                    CreateDate = DateTime.Now,
                    Owner = new Player() { Name = "Faker" },
                }
            };

            db.items.AddRange(items); // 여러개 넣을때 
            db.SaveChanges(); // 커밋하는 느낌. 
        }
    }

Program

    class Program
    {
        static void Main(string[] args)
        {
            DbCommands.InitializeDB(forceReset: true);
        }
    }

InitializeDB를 DbCommands 클래스에 옮긴 후 Main에서 static 함수를 호출하는 식으로 수정했다.

CreateTestData 함수를 호출하면 Name 프로퍼티가 Strevelun인 플레이어 객체를 하나 생성한 후 item List를 선언하여 Item 객체를 생성함과 동시에 리스트에 넣어주었다.

각각 TemplateId를 정해주고, Owner를 정해주었다. 세번째 아이템의 Owner는 Faker라는 이름의 플레이어로 설정해두었다.

클래스 이름 + Id는 자동으로 primary key로 인식하는 듯 하고 따로 정해주지 않아도 자동으로 정해지는 것 같다. (외래키도 마찬가지)

CRUD(Create, Read, Update, Delete)

DbCommands

	...

 public static void ReadAll()
        {
            using (var db = new AppDbContext())
            {
                // AsNoTracking : ReadOnly. Items 내용을 변경하는 것이 아닌 읽기 목적
                // Include : Eager loading (즉시 로딩)
                foreach(Item item in db.Items.AsNoTracking().Include(i => i.Owner)) // 외래키 사용 가능
                {
                    Console.WriteLine($"TemplateId({item.TemplateId}) Owner({item.Owner.Name} CreatedDate({item.CreateDate})");
                }
            }
        }

        // 특정 플레이어가 소지한 아이템들의 CreateDate를 수정
        public static void UpdateDate()
        {
            Console.Write("플레이어 이름 입력 : ");
            string name = Console.ReadLine();

            using (var db = new AppDbContext())
            {
                // Owner.Name과 name이 똑같은 것만 추출
                var items = db.Items.Include(i => i.Owner).Where(i => i.Owner.Name == name); 
                
                foreach(Item item in items)
                {
                    item.CreateDate = DateTime.Now;
                }

                db.SaveChanges();
            }

            ReadAll();
        }

        public static void DeleteItem()
        {
            Console.Write("플레이어 이름 입력 : ");
            string name = Console.ReadLine();

            using (var db = new AppDbContext())
            {
                // Owner.Name과 name이 똑같은 것만 추출
                var items = db.Items.Include(i => i.Owner).Where(i => i.Owner.Name == name);

                db.Items.RemoveRange(items);

                db.SaveChanges();
            }

            ReadAll();
        }

Program

 class Program
    {
        static void Main(string[] args)
        {
            DbCommands.InitializeDB(forceReset: true);

            Console.WriteLine("명령어 입력");
            Console.WriteLine("[0] Force Reset");
            Console.WriteLine("[1] ReadAll");
            Console.WriteLine("[2] UpdateDate");
            Console.WriteLine("[3] DeleteItem");

            while(true)
            {
                Console.Write("입력 : ");
                string command = Console.ReadLine();
                switch(command)
                {
                    case "0":
                        DbCommands.InitializeDB(forceReset: true);
                        break;
                    case "1":
                        DbCommands.ReadAll();
                        break;
                    case "2":
                        DbCommands.UpdateDate();
                        break;
                    case "3":
                        DbCommands.DeleteItem();
                        break;
                }
            }
        }
    }

변경한 코드에서 함수와 그 함수를 실행하는 코드를 추가적으로 작성했다.

profile
개인 공부 정리

0개의 댓글