添加到列表中会重复

时间:2018-07-05 15:34:35

标签: c# asp.net-core entity-framework-core

我正在尝试将候选人描述添加到列表中,并创建一个新的候选人。 这是我的模型和控制器:

public class Candidate : BaseEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Number { get; set; }
    public string ProfileText { get; set; }
    public Byte[] CV { get; set; }
    public string CVNAME { get; set; }
    public List<Profile> ProfileList { get; set; }
    public String Description { get; set; }
    public Boolean Saving { get; set; }
    public string Title { get; set; }
    public DateTime DateOfDescription { get; set; }
    public List<Candidate> DescriptionList { get; set; }
    public Candidate()
    {
        DescriptionList = new List<Candidate>();
    }

}


public IActionResult CandidateHistory(int Id)
    {

        using (var applicationcontext = new ApplicationContext())
        {
            var candidate = applicationcontext.Candidates.AsNoTracking().Include(q => q.DescriptionList).Single(q => q.Id == Id); //Recieving all the data from the Candidate With the ID = Id
            if (candidate == null) //if Candidate isn't found return a error page
            {
                return NotFound();
            }


            return View(candidate);
        }
    }

    [HttpPost, ActionName("CandidateHistory")]
    [ValidateAntiForgeryToken]
    public IActionResult CandidateHistoryPost([Bind("Description, Title, DateOfDescription, Saving")]Candidate candidate ,int Id)
    {
        try
        {
            if (ModelState.IsValid)
            {
                using (var applicationContext = new ApplicationContext())
                {  var candidates = applicationContext.Candidates.AsNoTracking().Include(q => q.DescriptionList).Single(q => q.Id == Id);    //Getting all the DATA from the Candidate with the Id passed in the Get Method
                    candidates.DescriptionList.Add(candidates);
                    applicationContext.Candidates.Update(candidates);
                    applicationContext.SaveChanges();
                    return RedirectToAction("CandidateHistory");
                }
            }
        }
        catch (DbUpdateException ex)
        {
            //Log the error (uncomment ex variable name and write a log.
            ModelState.AddModelError("", "Unable to save changes. " + "Try again, and if the problem persists " + "see your system administrator.");
        }
        return View();
    }

也许是因为我要添加候选模型,而不是候选模型列表吗? 如您在该图中所看到的,它确实为我添加到列表中的每个描述创建了一个新的候选。 enter image description here

4 个答案:

答案 0 :(得分:0)

那是因为您正在使用AsNoTracking来检索列表。从字面上看,这意味着EF没有跟踪这些项目。然后,当您将列表保存回去时,它将它们附加为新项目。

答案 1 :(得分:0)

AsNoTracking告诉实体框架不要缓存数据集。基本上,它会为每个调用返回数据库,而不是使用内部存储器。似乎您的列表中有循环引用。您为什么不只返回候选对象列表,而不使用嵌套集合?从数据库调用返回IList。

答案 2 :(得分:0)

这对我来说似乎很奇怪...

var candidates = applicationContext.Candidates.AsNoTracking().Include(q => q.DescriptionList).Single(q => q.Id == Id);    //Getting all the DATA from the Candidate with the Id passed in the Get Method
candidates.DescriptionList.Add(candidates);

我将其解释为您要向其添加基本候选实体。我无法阅读图片,因此无法验证您的结果。但是您可能会遇到一些真正的奇怪行为。

答案 3 :(得分:0)

我猜你有一个打字错误。这里=>

您正在做candidates.DescriptionList.Add(candidates);

您应该做candidates.DescriptionList.Add(candidate);

传递给该方法的删除参数为candidate,并且您正在添加candidates