Добавление в список делает дубликат - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь добавить в список описание кандидата, и он создает нового кандидата. Вот моя модель и контроллер:

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 голосов
/ 05 июля 2018

Полагаю, у вас была ошибка ввода. Здесь =>

Вы делаете candidates.DescriptionList.Add(candidates);

Вы должны делать candidates.DescriptionList.Add(candidate);

Параметр удаления, переданный методу, равен candidate, и вы добавляете candidates.

0 голосов
/ 05 июля 2018

AsNoTracking указывает Entity Framework не кэшировать набор данных. По сути, он возвращается к базе данных для каждого вызова вместо использования внутренней памяти. Похоже, у вас есть круговая ссылка с вашим списком. Почему бы вам просто не вернуть список объектов-кандидатов вместо использования вложенной коллекции? Верните IList из вашей базы данных.

0 голосов
/ 05 июля 2018

Мне это кажется странным ...

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);

Я понимаю, что вы добавляете базовую сущность-кандидат в себя. Я не могу прочитать изображение, поэтому я не могу проверить ваши результаты. Но вы можете столкнуться с некоторым действительно странным поведением.

0 голосов
/ 05 июля 2018

Это потому, что вы получаете список, используя AsNoTracking. Это буквально означает, что EF не отслеживает эти элементы. Затем, когда вы сохраняете список обратно, он прикрепляет их как новые элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...