Как разработать вложенные классы в .NET Core API, чтобы добраться до конкретной схемы?

Aug 20 2020

Я впервые возился с Entity Framework в API .NET Core (используя последнюю версию .NET Core).

На данный момент у меня 2 класса:

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) «Навыки» со столбцами: 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
     }
]

Теперь я пытаюсь понять, как я могу спроектировать классы, чтобы при запуске создавать базу данных с использованием структуры сущностей, чтобы в итоге я получил три таблицы:

(1) «Сотрудники» со столбцами: Id, FirstName, LastName, Gender, JoinedCompany.

(1) «EmployeeSkills» со столбцами: Id, EmployeeId, SkillId.

(2) «Навыки» со столбцами: 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; }
}