Вам нужно сообщить 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