特定のスキーマに到達するために.NETCore APIでネストされたクラスを設計するにはどうすればよいですか?

Aug 20 2020

.NET Core API(.NET Coreの最新リリースを使用)で初めてEntityFrameworkをいじっています。

現在、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();
        }

現在、EntityFrameworkの移行を使用してテーブルを作成しています。既存のクラスを使用すると、次のテーブルが2つのテーブルになります。

(1)列を持つ「従業員」:Id、FirstName、LastName、Gender、JoinedCompany

(2)列を持つ「スキル」:Id、SkillName、EmployeeId

これらのテーブルにいくつかのデータを入力し、postmanでAPIのエンドポイントの1つにヒットすると、次の情報が返されます。

[
    {
        "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)列を持つ「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; }
}