asp.net-mvc - 有效地更新多对多关系

标签 asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5

我有 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/

相关文章:

c# - EF CTP4 : "The context cannot be used while the model is being created."

c# 派生自基类 apicontroller - 在基类中,Request 对象为 null

asp.net-mvc - AspNet核心3.0和3.1 : Enable runtime compilation for Razor Pages

javascript - 调用 window.open() 在 IE 11 + Windows 8.1 Preview 上返回 null

c# - 使用 MVC 3 Entity Framework 代码优先,如何在一对多关系中创建一个新的 "many"对象?

asp.net-mvc-4 - @using(Html.BeginForm()) 返回格式异常 mvc4

c# - IIS 10.0 最大请求长度 .NET MVC

c# - 如何处理 NUnit 中抛出的异常

c# - 了解枚举和 ViewModel

c# - 有什么方法可以使 EntityFramework 的 SaveChanges() 方法跳过一个条目(如果它已经存在)?