管理实体中的静态数据项

San*_*mar 4 c# entity-framework entity-framework-core

我的域模型如下

public class Employee
{
    public long Id { get; set; }
    public string Name { get; set; }
    public List<Skills> Skills { get; set; }
}

public enum Skills
{
    JAVA,
    DOTNET,
    PYTHON
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将实体框架模型建模为 -

public class Employee
{
    public long Id { get; set; }
    public string Name { get; set; }
    public ICollection<Skills> Skills { get; set; }
}

public class Skills
{
    public long Id { get; set; }
    public string Skill { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

技能仅限于少数价值类型之一。当实体框架创建表时,它会在 Skills 表中的 EmployeeId PK 上创建外键。本质上,员工表中的每个条目在技能表中都会有一个或多个条目。同样,如果技能在另一个实体中被引用,则将添加另一列来存储引用它的键。我不确定这是否是正确的方法。有没有办法将技能表限制为仅静态数据并具有连接表?管理与静态数据的关系的最佳实践是什么?

Ant*_*lov 5

这里有经典的多对多关系:一名员工可以拥有多种技能,而一项技能可以由许多员工拥有。EF Core 不像 EF6 那样支持隐式多对多关系,因此需要引入中间实体。您的模型将如下所示:

public class Employee
{
    public long Id { get; set; }
    public string Name { get; set; }
    public ICollection<Skills> Skills { get; set; }
}

public class Skills
{
    public long Id { get; set; }
    public string Skill { get; set; }

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

public class EmployeeSkills
{
    public long SkillsId { get; set; }
    public Skills Skills {get; set;}

    public long EmployeeId { get; set; }
    public Employee Employee {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

在 DbContext 中,应该为中间实体设置复合键,并且技能数据也可以在那里播种。

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        modelBuilder.Entity<EmployeeSkills>(e =>
        {
            e.HasKey(l => new { l.SkillsId, l.EmployeeId });
        });

        modelBuilder.Entity<Skills>(e =>
        {
            e.HasData(new[]
            {
                new Skills() { Id = 1, Skill="JAVA" },
                new Skills() { Id = 2, Skill="DOTNET" },
                new Skills() { Id = 3, Skill="PYTHON" },
            });
        });

        base.OnModelCreating(modelBuilder);
    }
Run Code Online (Sandbox Code Playgroud)