Bagaimana cara mendesain kelas bersarang dalam .NET Core API untuk mendapatkan skema tertentu?

Aug 20 2020

Saya mengotak-atik Entity Framework untuk pertama kalinya dalam .NET Core API (menggunakan rilis terbaru .NET Core).

Saat ini saya memiliki 2 kelas:

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; }
}

Saya juga satu DBContextkelas dengan

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

dan saya dapat mengambilnya dengan yang berikut:

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

Sekarang, saya menggunakan migrasi Entity Framework untuk membuat tabel. Menggunakan kelas yang ada saya mendapatkan tabel berikut dua tabel:

(1) "Karyawan" dengan kolom: Id, FirstName, LastName, Gender, JoinedCompany

(2) "Keterampilan" dengan kolom: Id, SkillName, EmployeeId

Saya mengisi tabel ini dengan beberapa data dan mendapatkan kembali yang berikut ketika saya menekan salah satu titik akhir API di tukang pos:

[
    {
        "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
     }
]

Sekarang, yang saya coba cari tahu adalah bagaimana saya bisa mendesain kelas sehingga ketika saya menjalankan buat database menggunakan kerangka entitas sehingga saya berakhir dengan tiga tabel:

(1) "Karyawan" dengan kolom: Id, FirstName, LastName, Gender, JoinedCompany

(1) "EmployeeSkills" dengan kolom: Id, EmployeeId, SkillId

(2) "Keterampilan" dengan kolom: Id, SkillName

Alasannya adalah saya tidak ingin menyimpan string "SkillName" berulang kali setiap kali muncul untuk karyawan. Saya hanya ingin menggunakan Id. Ini juga akan mengubah GetEmployeesAsyncmetode yang saya terapkan di atas juga. Terima kasih.

Jawaban

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; }
}