Ошибка: «свойство альтернативного ключа 'id' равно null" с вызовом "Update" для Cosmos DB и Entity Framework Core 3.1.2 - PullRequest
1 голос
/ 15 марта 2020

Допустим, у меня есть простая модель 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();
}

1 Ответ

1 голос
/ 15 марта 2020

Редактировать: Я полагаю, что проблема возникает из-за свойства, которое EF Core автоматически генерирует для каждого элемента с именем "id", в частности для всех в нижнем регистре и отдельно от ваших ключей, определенных в вашей модели. По-видимому, он задается c для поставщика Cosmos DB, и проблема с нулевым значением отмечена в документации для EF Core -> Поставщики баз данных -> Cosmos в разделе «Работа с отключенными объектами».

Видимо EF Core генерирует это свойство только тогда, когда сущность переходит в состояние «Добавлено». Поэтому, когда вы вызываете Attach, это свойство "id" имеет значение null, следовательно, исключение. Обходной путь указан в документации с гораздо лучшим объяснением, чем я могу дать.

Ссылка ниже на страницу документации EF Core для провайдера Cosmos. Прокрутите страницу обзора до конца, чтобы найти раздел об отключенных объектах, который охватывает это.

https://docs.microsoft.com/en-us/ef/core/providers/cosmos/?tabs=dotnet-core-cli#working -with-disconnected-entity

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