我的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表限制为仅包含静态数据并具有连接表?管理与静态数据的关系的最佳实践是什么?
答案 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);
}