2

我有 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#
    • 2MVC
    • 3 SQL
    • 4 n休眠
    • 5 爪哇

我已经在 AUTOGENERATED 表中建立了关联:

  • 候选人技能
    • 候选人 ID 技能 ID
    • 1 2
    • 1 3

现在我想更新候选人 ID 1 的技能,即汤姆想要删除他的 SkillId:2 即 MVC 并分别添加新的 SkillId:4 和 5 即 nHibernate 和 Java

我从3, 4 & 5 & 和候选 Id : 1的形式中得到一组Id,因为 2 已被用户删除。

我的 API 是这样的:

public Candidate Add(int candidateId, int[] skillIds)
{
    var model = dbContext.candidate.Find(candidateId);
}

如何以有效的方式更新候选记录,使数据库调用最少?

4

3 回答 3

4

在 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在你的模型中创建一个连接类类,这样你就可以在不加载候选对象或技能对象的情况下添加/删除关联。

于 2013-10-04T14:58:52.480 回答
2
public class CandidateToSkill
{
    public Candidate Candidate{ get; set; }
    [Key,Column(Order = 0)]
    public int CandidateID { get; set; }


    [Key,Column(Order = 1)]
    public int SkillID{ get; set; }

    public Skill Skill { get; set; }


} 

您还需要在 dbContext 类中将此类添加为 DbSet

public class Candidate
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<CandidateToSkill> CandidateSkills{ get; set; }
}

public class Skill
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<CandidateToSkill> SkillCandidates{ get; set; }
}

和控制器代码

public void Add(int candidateId, int[] skillIds)
{
    using (var db = new YourdbContext())
        {
            foreach (int skillID in skillIds )
            {
                 db.CandidateToSkill.Add(new CandidateToSkill(){skillID,candidateId});
            }
            db.SaveChanges();
        }

}

在此示例中,您只需标记一个候选者以添加到我们的上下文中(在您的链接表中)并使用 db.SaveChanges() 将 em 添加到 db

于 2013-10-04T15:11:33.647 回答
0

您可以将实体状态标记为已修改并保存上下文。

public void UpdateCandidate(Candidate candidate)
{
   Context.Entry(candidate).State = EntityState.Modified;
}
于 2013-10-04T14:45:29.350 回答