我有 2 个模型类。
public class Candidate
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Skill> Skills { get; set; }
}
public class Skill
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Candidate> Candidates { get; set; }
}
这为我创建了 3 个表。
- 候选人
- 身份证名
- 1 汤姆
- 2 约翰
- 技能
- 身份证名
- 1 个 C#
- 2个MVC
- 3 个 SQL
- 4 nHibernate
- 5 Java
我在 AUTOGENERATED 表中建立了关联:
- 候选人技能
- CandidateId SkillId
- 1 2
- 1 3
现在我想更新 candidateId 1 的技能,即 Tom 想要删除他的 SkillId:2,即 MVC,并添加新的 SkillId:4 和 5,即 nHibernate 和 Java。。 p>
我从表单中得到一组 ID ,即 3、4 & 5 & 和候选 ID:1 ,因为 2 已被用户删除。
我的 API 是这样的:
public Candidate Add(int candidateId, int[] skillIds)
{
var model = dbContext.candidate.Find(candidateId);
}
我如何以有效的方式更新候选人记录,进行最少的数据库调用?
最佳答案
对于 Entity Framework 中的多对多关联,您只能使用对象,而不能使用原始 Id 值。
public void Add(int candidateId, int[] skillIds)
{
var model = dbContext.candidate.Include(c => c.Skills)
.Single(candidateId => c.candidateId == candidateId);
var skills = dbContext.Skills.Where(s => skillIds.Contains(s.Id)).ToArray();
foreach (var skill in skills)
{
model.Skills.Add(skill);
}
dbContext.SaveChanges();
}
您必须获取加载了技能的候选人,因此 Include
。必须为 EF 加载技能,以便能够跟踪对集合的更改。
如果优化性能对您来说真的很重要,您必须在模型中创建一个连接类 CandidateSkill
类,这样您就可以在不加载候选人或技能对象的情况下添加/删除关联。
关于asp.net-mvc - 有效地更新多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19183887/