탐색 속성은 EF에서 엔터티와 엔터티간의 관계를 형성하게 해주는 속성이며 관계 속성이라고도 할 수 있습니다. 아래 코드를 참조해주세요.


User
와 Dept
로 엔터티를 만든 후, 질문자님이 만드신 구조를 참조해서 다 대 다
탐색 속성을 부여했습니다.
| User
[Table(nameof(User))]
public record User
{
[Key]
public string UserId { get; set; } = default!;
public string UserName { get; set; } = default!;
public virtual ICollection<Dept> Depts { get; set; } = default!;
}
| Dept
public record Dept
{
[Key]
public string DeptId { get; set; } = default!;
public string DeptName { get; set; } = default!;
public virtual ICollection<User> Users { get; set; } = default!;
}
여기서 User의 Depts 속성과 Dept의 Users의 속성이 탐색 속성
입니다.
| Context
public class Context : DbContext
{
public DbSet<User> Users => Set<User>();
public DbSet<Dept> Depts => Set<Dept>();
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// "database.db" 파일로 SQLite 사용
optionsBuilder.UseSqlite("Data Source=database.db")
.UseLazyLoadingProxies();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}
}
SQLite로 간단한 DBContext를 만들고요, 중요한 건 .UseLazyLoadingProxies()
로 지연 로딩
을 활성화 해야 합니다.
데이터베이스 업데이트를 하면 다음의 테이블이 생성됩니다.

삽입
// 사용자 및 부서 삽입 {{{
var newUser = new User
{
UserId = "test",
UserName = "테스트",
Depts = new List<Dept> { new() { DeptId = "test_grp", DeptName = "테스트 부서" } }
};
c.Users.Add(newUser);
c.SaveChanges();
이렇게 하면 데이터베이스의 테이블에 다음과 같이 값이 삽입 됩니다.



이제 탐색 속성
과 지연 로딩
에 의해 다음처럼 질의가 가능하게 됩니다.
var user = c.Users.Find("test"); // test 사용자를 찾아
if (user is null)
return;
// 사용자명과 사용자의 부서명 출력
Console.WriteLine($"User : {user.UserName}({user.UserId})");
Console.WriteLine($"User Dept : {user.Depts.First().DeptName}");
샘플코드