Обновить контекст в SQL Server из ASP.NET Core 2.2 - PullRequest
0 голосов
/ 07 апреля 2019
_context.Update(v) ;
_context.SaveChanges();

Когда я использую этот код, SQL Server добавляет новую запись вместо обновления текущего контекста

[HttpPost]
public IActionResult PageVote(List<string> Sar)
{
    string name_voter = ViewBag.getValue = TempData["Namevalue"];

    int count = 0;

    foreach (var item in Sar)
    {
        count = count + 1;
    }

    if (count == 6)
    {
        Vote v = new Vote()
                 {
                    VoteSarparast1 = Sar[0],
                    VoteSarparast2 = Sar[1],
                    VoteSarparast3 = Sar[2],
                    VoteSarparast4 = Sar[3],
                    VoteSarparast5 = Sar[4],
                    VoteSarparast6 = Sar[5],
                 };

        var voter = _context.Votes.FirstOrDefault(u => u.Voter == name_voter && u.IsVoted == true);

        if (voter == null)
        {
            v.IsVoted = true;
            v.Voter = name_voter;
            _context.Add(v);
            _context.SaveChanges();

            ViewBag.Greeting = "رای شما با موفقیت ثبت شد";
            return RedirectToAction(nameof(end));
        }

        v.IsVoted = true;
        v.Voter = name_voter;

        _context.Update(v);
        _context.SaveChanges();

        return RedirectToAction(nameof(end));
    }
    else
    {
        return View(_context.Applicants.ToList());
    }
}

1 Ответ

1 голос
/ 07 апреля 2019

Вам нужно сообщить DbContext о вашей сущности. Если вы делаете var vote = new Vote() vote не имеет Id. DbContext видит это и думает, что вы хотите Add новую сущность, поэтому он просто делает это. DbContext отслеживает все сущности, которые вы загружаете из него, но, поскольку это всего лишь новый экземпляр, он понятия не имеет об этом.

Чтобы выполнить обновление, у вас есть два варианта:

1 - каким-то образом загрузить Vote из базы данных; Если у вас есть идентификатор, используйте его, чтобы найти его.

// Loads the current vote by its id (or whatever other field..)
var existingVote = context.Votes.Single(p => p.Id == id_from_param);

// Perform the changes you want..
existingVote.SomeField = "NewValue";                

// Then call save normally.
context.SaveChanges();

2 - или, если вы не хотите загружать его из базы данных, вам нужно вручную сообщить DbContext, что делать:

// create a new "vote"...
var vote = new Vote
{
    // Since it's an update, you must have the Id somehow.. so you must set it manually
    Id = id_from_param,

    // do the changes you want. Be careful, because this can cause data loss!
    SomeField = "NewValue"
};

// This is you telling the DbContext: Hey, I control this entity. 
// I know it exists in the DB and it's modified
context.Entry(vote).State = EntityState.Modified;

// Then call save normally.
context.SaveChanges();

Любой из этих двух подходов должен решить вашу проблему, но я предлагаю вам прочитать немного больше о том, как работает Entity Framework. Это очень важно для успеха (и производительности) ваших приложений. Особенно option 2 выше может вызвать много проблем. Есть причина, по которой DbContext отслеживает сущности, поэтому вам не нужно это делать. Это очень сложно, и все может идти на юг быстро.

Некоторые ссылки для вас: ChangeTracker в Entity Framework Core Работа с отключенным графом сущностей в Entity Framework Core

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