我正在尝试将候选人描述添加到列表中,并创建一个新的候选人。 这是我的模型和控制器:
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();
}
也许是因为我要添加候选模型,而不是候选模型列表吗? 如您在该图中所看到的,它确实为我添加到列表中的每个描述创建了一个新的候选。
答案 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
。