특정 스키마를 얻기 위해 .NET Core API에서 중첩 된 클래스를 디자인하는 방법은 무엇입니까?

Aug 20 2020

.NET Core API (최신 릴리스의 .NET Core 사용)에서 처음으로 Entity Framework를 엉망으로 만들고 있습니다.

현재 나는 두 가지 수업이 있습니다.

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Gender { get; set; }
    public DateTime JoinedCompany { get; set; }
    public ICollection<Skill> Skills { get; set; }
}

public class Skill
{
    public int Id { get; set; }
    public string SkillName { get; set; }
}

나는 또한이 DBContext클래스를

public DbSet<Employee> Employees { get; set; }
public DbSet<Skill> Skills { get; set; }

다음과 같이 검색 할 수 있습니다.

public async Task<IReadOnlyList<Employee>> GetEmployeesAsync () {
            return await _context.Employees
            .Include(p => p.Skills)
            .ToListAsync();
        }

이제 Entity Framework 마이그레이션을 사용하여 테이블을 만듭니다. 기존 클래스를 사용하여 다음 테이블 두 개의 테이블을 얻습니다.

(1) 열이있는 "직원": Id, FirstName, LastName, Gender, JoinedCompany

(2) 열이있는 "Skills": Id, SkillName, EmployeeId

이 테이블을 일부 데이터로 채우고 우체부에서 API의 끝점 중 하나에 도달하면 다음을 다시 얻습니다.

[
    {
        "firstName": "Jess",
        "lastName": "Turner",
        "gender": "F",
        "joinedCompany": "2018-10-04T00:00:00",
        "skills": [
            {
                "skillName": "T-SQL",
                "id": 1
            },
            {
                "skillName": "Angular",
                "id": 2
            },
            {
                "skillName": "Vue",
                "id": 3
            },
            {
                "skillName": "Redux",
                "id": 4
            }
        ],
        "id": 1
    },
    {
        "firstName": "Olivia",
        "lastName": "Lu",
        "gender": "F",
        "joinedCompany": "2015-03-31T00:00:00",
        "skills": [
            {
                "skillName": "Hadoop",
                "id": 5
            },
            {
                "skillName": "Azure Databricks",
                "id": 6
            },
            {
                "skillName": "Spark",
                "id": 7
            },
            {
                "skillName": "Python",
                "id": 8
            },
            {
                "skillName": "T-SQL",
                "id": 9
            }
        ],
        "id": 2
    },
    {
        "firstName": "Jonah",
        "lastName": "Smythe",
        "gender": "M",
        "joinedCompany": "2020-08-11T00:00:00",
        "skills": [],
        "id": 3
     }
]

이제 제가 알아 내고자하는 것은 클래스를 디자인하여 실행시 엔티티 프레임 워크를 사용하여 데이터베이스를 생성하여 3 개의 테이블로 끝나도록하는 방법입니다.

(1) 열이있는 "직원": Id, FirstName, LastName, Gender, JoinedCompany

(1) Id, EmployeeId, SkillId 열이있는 "EmployeeSkills"

(2) 열이있는 "Skills": Id, SkillName

그 이유는 "SkillName"문자열이 직원에게 나타날 때마다 계속해서 저장하고 싶지 않기 때문입니다. 이드를 사용하고 싶습니다. 이것은 또한 GetEmployeesAsync위에서 적용한 방법을 변경합니다 . 감사합니다.

답변

1 spzvtbg Aug 20 2020 at 14:52
public class Employee
{
    public int Id { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string Gender { get; set; }

    public DateTime JoinedCompany { get; set; }

    public ICollection<EmployeeSkill> Skills { get; set; } = new HashSet<EmployeeSkill>();
}

public class Skill
{
    public int Id { get; set; }

    public string SkillName { get; set; }

    public ICollection<EmployeeSkill> Emploees { get; set; } = new HashSet<EmployeeSkill>();
}

public class EmployeeSkill
{
    public int EmployeeId { get; set; }

    public Employee Employee { get; set; }

    public int SkillId { get; set; }

    public Skill Skill { get; set; }
}

public class MyDbContext : DbContext
{

    public DbSet<Employee> Employees { get; set; }

    public DbSet<Skill> Skills { get; set; }

    public DbSet<EmployeeSkill> EmployeesSkills { get; set; }
}