在实体中管理静态数据项

时间:2018-08-08 15:51:15

标签: c# entity-framework entity-framework-core

我的Domain模型如下所示

Array
(
    [0] => 1.2.3.4
    [1] =>
    [2] =>
)
Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)

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

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
}

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

1 个答案:

答案 0 :(得分:1)

在这里您具有经典的多对多关系:一个雇员可以拥有许多技能,而许多雇员可以拥有一种技能。 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;}
}

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