Entity Framework Relation 정리
안녕하세요.
이번에는 Entity Framework Relation 에 대해 정리해보도록 하겠습니다.
1. 일대일 관계 (One-to-One Relationship)
일대일 관계는 두 테이블 간의 관계로, 한 테이블의 각 행이 다른 테이블의 정확히 하나의 행과 연결되는 경우입니다.
public class User { public int Id { get; set; } public string Username { get; set; } public UserProfile Profile { get; set; } } public class UserProfile { public int Id { get; set; } public string Bio { get; set; } public int UserId { get; set; } public User User { get; set; } }
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>() .HasOne(u => u.Profile) .WithOne(p => p.User) .HasForeignKey<UserProfile>(p => p.UserId); }
위 예제서는 User가 마스터가되고 UserProfile이 디테일이 됩니다.
그래서 .HasForeignKey<UserProfile>(p => p.UserId); 와 같이 UserProfile에서 ForeignKey를 설정했습니다.
2. 일대다 관계 (One-to-Many Relationship)
일대다 관계는 한 테이블의 각 행이 다른 테이블의 여러 행과 연결되는 경우입니다. 가장 일반적인 관계 유형입니다.
public class Blog { public int Id { get; set; } public string Title { get; set; } public ICollection<Post> Posts { get; set; } } public class Post { public int Id { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } }
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .HasMany(b => b.Posts) .WithOne(p => p.Blog) .HasForeignKey(p => p.BlogId); }
여기서는 Blog가 많은 Post를 갖고있기 때문에
.HasMany(b => b.Posts) .WithOne(p => p.Blog)
와 같이 설정하였습니다.
3. 다대다 관계 (Many-to-Many Relationship)
다대다 관계는 한 테이블의 각 행이 다른 테이블의 여러 행과 연결되고, 반대로 다른 테이블의 각 행이 첫 번째 테이블의 여러 행과 연결되는 경우입니다.
EF Core 5.0부터는 직접적으로 다대다 관계를 지원합니다.
public class Student { public int Id { get; set; } public string Name { get; set; } public ICollection<Course> Courses { get; set; } } public class Course { public int Id { get; set; } public string Title { get; set; } public ICollection<Student> Students { get; set; } }
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Student>() .HasMany(s => s.Courses) .WithMany(c => c.Students) .UsingEntity<Dictionary<string, object>>( "StudentCourse", j => j.HasOne<Course>().WithMany().HasForeignKey("CourseId"), j => j.HasOne<Student>().WithMany().HasForeignKey("StudentId")); }
여기서는
.HasMany(s => s.Courses) .WithMany(c => c.Students)
와 같이 양쪽다 다대다의 관계가 됩니다.
일반적으로 다대다의 관계에서는 중간 테이블을만드는데 여기서는 StudentCourse라는 테이블을 생성하도록 하였습니다.
하지만 보통은 일대일 관계를 주로 사용하며 이렇게 다대다의 관계를 써본적은 없습니다. 단지 이론상으로 이렇게 한다는 정도로 참고하시면
좋을 것 같습니다.