Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 管理实体中的静态数据项_C#_Entity Framework_Entity Framework Core - Fatal编程技术网

C# 管理实体中的静态数据项

C# 管理实体中的静态数据项,c#,entity-framework,entity-framework-core,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 } 公共类员工 { 公共长Id{get;set;} 公共字符串名称{ge

我有我的领域模型如下

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
}
公共类员工
{
公共长Id{get;set;}
公共字符串名称{get;set;}
公共列表技能{get;set;}
}
公众普查技能
{
JAVA
网络,
python
}
我试图将实体框架模型建模为-

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; }
}
公共类员工
{
公共长Id{get;set;}
公共字符串名称{get;set;}
公共i收集技能{get;set;}
}
公共课技能
{
公共长Id{get;set;}
公共字符串技能{get;set;}
}
技能仅限于少数价值类型之一。当实体框架创建表时,它正在EmployeeId PK上创建一个外键输入技能表。基本上,Employee表中的每个条目在Skills表中都有一个或多个条目。同样,如果技能在另一个实体中引用,则会添加另一列来存储引用它的键。
我不确定这是不是正确的方法。有没有办法将技能表限制为只包含静态数据并具有联接表?管理与静态数据的关系的最佳实践是什么?

这里有经典的多对多关系:一名员工可以拥有多种技能,而一项技能可以被许多员工拥有。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;}
}
公共类员工
{
公共长Id{get;set;}
公共字符串名称{get;set;}
公共i收集技能{get;set;}
}
公共课技能
{
公共长Id{get;set;}
公共字符串技能{get;set;}
公共ICollection雇员{get;set;}
}
公共职业技能
{
公共长技能SID{get;set;}
公共技能{get;set;}
公共长雇员ID{get;set;}
公共雇员雇员{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);
    }
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
实体(e=>
{
e、 HasKey(l=>new{l.SkillsId,l.EmployeeId});
});
实体(e=>
{
e、 HasData(新[]
{
新技能(){Id=1,Skill=“JAVA”},
新技能(){Id=2,Skill=“DOTNET”},
新技能(){Id=3,Skill=“PYTHON”},
});
});
基于模型创建(modelBuilder);
}

Ok,这将在技能表中为每位员工创建一个条目。我想知道是否有办法将技能限制在数据元素上。不确定这是否是建议的方法。在建议的解决方案中,您有3个表Employee、EmployeeSkills和Skills,要向员工添加新技能,将在EmployeeSkills表中创建新条目。将数据添加到技能表是应用程序逻辑的责任,您可以将此表设置为只读。另一种解决方案既笨拙又低效,但如果技能数量仅限于一个枚举,则可以将每个员工的技能列表存储为逗号分隔的值字符串,例如employee.skills=“JAVA,PYTHON”。在这种情况下,您的枚举将是可用技能的黄金来源,表不是必需的。