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 上创建外键。本质上,员工表中的每个条目在技能表中都会有一个或多个条目。同样,如果技能在另一个实体中被引用,则将添加另一列来存储引用它的键。我不确定这是否是正确的方法。有没有办法将技能表限制为仅静态数据并具有连接表?管理与静态数据的关系的最佳实践是什么?
这里有经典的多对多关系:一名员工可以拥有多种技能,而一项技能可以由许多员工拥有。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)
| 归档时间: |
|
| 查看次数: |
2543 次 |
| 最近记录: |