我想使用。net Core MVC和实体框架从下拉菜单中存储多个值。我不知道该怎么做。这是我的模型代码
public class Project
{
[Key]
public int Id { get; set; }
[Required]
public string Title { get; set; }
public string? Description { get; set; }
public List<int> SkillsID { get; set; }
[ValidateNever]
public List<Skill> skills { get; set; }
}
从这里(https://learn.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key)开始了解EF中的关系。在您的情况下,您可能希望在项目和技能之间建立多对多关系。这假定您将有一个技能列表,其中每个项目将自己与0、1或许多技能相关联。在这种情况下,你会有这样的类:
public class Project
{
// ... project properties.
public virtual ICollection<Skill> Skills { get; protected set; } = new List<Skill>();
}
public class Skill
{
// ... skill properties.
}
当映射时,你告诉EF项目.HasMany(x => x.Skills).WithMany()
,因为我们可能不需要每个单独技能实体的项目集合。最后一步是告诉EF如何关联这两个实体。在多对多关系中,这涉及到一个联接表,比如ProjectSkills表:
[tbl:ProjectSkills]
- PK,FK - ProjectId
- PK,FK - SkillId
您不跟踪实体中的fk列表。从数据库的角度来考虑。当将表与fk关联在一起时,在单行中不会有一个数组或诸如此类的fk。使用连接表
表的PK是项目ID和技能ID之间的组合,其中每个都是返回相应表的FK。EF可以按照约定创建这个表,如果您想对命名进行微调,也可以手动配置它。
如果你想跟踪关系的更多细节,比如跟踪CreatedDate等,那么你需要将关系映射为一个实体,如下所示:
public class Project
{
// ... project properties.
public virtual ICollection<ProjectSkill> ProjectSkills { get; protected set; } = new List<ProjectSkill>();
}
public class Skill
{
// ... skill properties.
}
public class ProjectSkill
{
[Key, Column(Order = 0)]
public int ProjectId { get; set; }
[Key, Column(Order = 1)]
public int SkillId { get; set; }
public DateTime CreatedDateTime { get; set; }
// .. Other details about the relationship.
[ForeignKey("ProjectId")]
public virtual Project Project { get; set; }
[ForeignKey("SkillId")]
public virtual Skill Skill { get; set; }
}
您可能会遇到使用这些连接实体的EF core示例,因为这是EF core早期版本(2,3.1)中所有多对多关系的要求。
对于一对多,其中技能特别属于一个项目,那么一个ProjectID将被放入Skill表中。项目实体将具有相同的技能集合,但是映射将是一个:.HasMany(x => x.Skills).WithOne()
,其中技能表将包含一个与给定项目相关联的ProjectID。EF可以将这种关系表示为单向的,项目有集合,技能不公开对项目的引用,或者双向的,你可以将项目引用添加到技能中。(.HasMany(x => x.Skills).WithOne(x => x.Project)
)