DataModel
[Table("Item")]
public class Item
{
public int ItemId { get; set; }
public int TemplateId { get; set; }
public DateTime CreateDate { get; set; }
[ForeignKey("OwnerId")]
public Player Owner { get; set; }
}
[Table("Player")]
public class Player
{
public int PlayerId { get; set; }
public string Name { get; set; }
public Item Item { get; set; }
public Guild Guild { get; set; }
}
[Table("Guild")]
public class Guild
{
public int GuildId { get; set; }
public string GuildName { get; set; }
public ICollection<Player> Members { get; set; }
}
DbCommands
public static void CreateTestData(AppDbContext db)
{
var strevelun = new Player() { Name = "Strevelun" };
var rookiss = new Player() { Name = "Rookiss" };
var faker = new Player() { Name = "faker" };
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);
db.SaveChanges();
}
public static void EagerLoading()
{
Console.Write("길드 이름 : ");
string name = Console.ReadLine();
using (var db = new AppDbContext())
{
Guild guild = db.Guilds.AsNoTracking()
.Where(g => g.GuildName == name)
.Include(g => g.Members)
.ThenInclude(p => p.Item)
.First();
foreach(Player player in guild.Members)
{
Console.WriteLine($"ItemId({player.Item.TemplateId}) Owner({player.Name})");
}
}
}
public static void ExplicitLoading()
{
Console.Write("길드 이름 : ");
string name = Console.ReadLine();
using (var db = new AppDbContext())
{
Guild guild = db.Guilds
.Where(g => g.GuildName == name)
.First();
db.Entry(guild).Collection(g => g.Members).Load();
foreach(Player player in guild.Members)
{
db.Entry(player).Reference(p => p.Item).Load();
}
foreach (Player player in guild.Members)
{
Console.WriteLine($"ItemId({player.Item.TemplateId}) Owner({player.Name})");
}
}
}
public static void SelectLoading()
{
Console.Write("길드 이름 : ");
string name = Console.ReadLine();
using (var db = new AppDbContext())
{
var info = db.Guilds
.Where(g => g.GuildName == name)
.Select(g => new
{
Name = g.GuildName,
MemberCount = g.Members.Count
})
.First();
Console.WriteLine($"GuildName({info.Name}), MemberCount({info.MemberCount}");
}
}