728x90
[Table("Item")]
public class Item
{
// 이름Id -> PK
public int ItemId { get; set; }
public int TemplateId { get; set; } // 101 = 집행검
public DateTime CreateDate { get; set; }
// 다른 클래스 참조 -> FK (Navigational Property)
[ForeignKey("OwnerId")]
public Player Owner { get; set; }
}
[Table("Player")]
// Entity 클래스 이름 = 테이블 이름 = Player
public class Player
{
// 이름Id -> PK
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; }
}
내가 처한 상황이다. Guild는 Player를 담고 있고 Player는 Item을 담고 있다.
✅ Include
Guild를 통해 Player의 상황을 알아볼 수 있다.
db.Guilds.AsNoTracking()
.Where(g => g.GuildName == name)
.Include(g => g.Members)
사용자에게서 GuildName을 받아 그 이름과 일치하는 길드 안에 있는 Members(Player)의 정보를 알아볼 수 있다. 하지만 그 Player가 지닌 Item 정보까지 알아볼 수는 없다. 이때는 ThenInclude를 사용해야 한다.
✅ ThenInclude
db.Guilds.AsNoTracking()
.Where(g => g.GuildName == name)
.Include(g => g.Members)
.ThenInclude(p => p.Item)
.First();
ThenInclude를 사용하면 Include보다 하나 더 깊게 들어가서 Guild에 있는 Player가 지닌 Item을 볼 수 있게 된다.
참고로 .First()는 하나의 데이터를 보여달라는 뜻이다. SelectTopOne 격으로 볼 수 있다.
728x90
'공부 > EFCore' 카테고리의 다른 글
[EFCore] DB에 이미 존재하는 사용자를 PK로 연결하려면? (0) | 2022.09.04 |
---|---|
[EFCore] SaveChanges를 호출하면 어떤 일이 일어날까 (0) | 2022.09.04 |
[EFCore] Entity State, 엔티티의 상태를 알아보자 (0) | 2022.09.04 |
[EFCore] Eager Loading / Explicit Loading / Select Loading (0) | 2022.09.02 |
[EFCore] System.TypeInitializationException과 Unable to load 'sni.dll' 오류해결하기 (0) | 2022.09.01 |