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(); // 커밋하는 느낌.
}
}
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로 인식하는 듯 하고 따로 정해주지 않아도 자동으로 정해지는 것 같다. (외래키도 마찬가지)
...
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();
}
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;
}
}
}
}
변경한 코드에서 함수와 그 함수를 실행하는 코드를 추가적으로 작성했다.