Допустим, у меня есть простая модель PersonModel
, как показано ниже, в которой я обновляю свойство FirstName
из ASP. NET Core 3.1 Blazor или MVC UI (веб-форма):
public class PersonModel
{
public Guid PersonModelId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Я отправляю модель в функцию http Azure и связываюсь с моделью. Здесь я внедряю EF Core и выполняю следующие действия для его обновления:
public async Task<int> UpdateAsync(TEntity entity)
{
_dbSet.Attach(entity); //<--this throws the error
_dbContext.Entry(entity).State = EntityState.Modified;
return await _dbContext.SaveChangesAsync();
}
У меня нет проблем с созданием или удалением сущностей с этой моделью, а для приведена следующая статья , я не Я не вижу никаких проблем при создании модели, которая «чиста» от любых специфических c требований к хранилищу (например, как ключ раздела или первичный ключ и т. д. c.), однако я не могу запустить код обновления, не получив следующая ошибка:
Невозможно отследить сущность типа 'PersonModel', поскольку свойство альтернативного ключа 'id' имеет значение null.
Кто-нибудь знает о конкретных c требованиях вокруг модели и использовать этот метод для обновления объекта? Есть ли альтернатива, которая столь же проста / элегантна, как пример из статьи в документации?
Я пробовал _dbContext.Update(entity)
, но я получаю точно такую же ошибку, которая заставляет меня полагать, что моей модели нужен "ID" свойство.
Я также попытался изменить настройки DbContext
следующим образом:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<PersonModel>().HasAlternateKey(p => p.PersonModelId);
}
... но это просто дает мне ту же ошибку, а также не меняет способ сущность сохраняется.
Обновление
Следуя указаниям из принятого ответа ниже, я написал следующие изменения, чтобы выполнить эту работу:
public async Task<int> UpdateAsync(TEntity entity)
{
var entry = _dbSet.Add(entity);
entry.State = EntityState.Unchanged;
_dbContext.Update(entity);
return await _dbContext.SaveChangesAsync();
}