จะออกแบบคลาสที่ซ้อนกันใน. NET Core API เพื่อไปยังสคีมาเฉพาะได้อย่างไร?

Aug 20 2020

ฉันกำลังยุ่งกับ Entity Framework เป็นครั้งแรกใน. NET Core API (โดยใช้. 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" ซ้ำแล้วซ้ำอีกในแต่ละครั้งที่ปรากฏสำหรับพนักงาน ฉันแค่ต้องการใช้ Id สิ่งนี้จะเปลี่ยน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; }
}