Обработка свойств с помощью «DatabaseGenerated» в ASP. NET Core WebAPI с Entity Framework Core - PullRequest
1 голос
/ 28 мая 2020

У меня есть следующий класс модели:

public class Item
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required(ErrorMessage = "You must provide a name.")]
    [MaxLength(255)]
    public string Name { get; set; }
}

При выполнении операций GET я хочу вернуть объект со свойством Id, чтобы пользователь мог знать, какой идентификатор запрашивать для обновления или указать c ПОЛУЧИТЬ. Однако я НЕ хочу, чтобы клиент мог предоставить значение для свойства ID при выполнении запросов POST, и хочу, чтобы оно генерировалось базой данных как часть объекта IDENTITY.

Как бы я мог добиться этого?

1 Ответ

1 голос
/ 29 мая 2020

Вы не можете вручную установить значение столбца Identity (Auto Increment).

Здесь, в приведенном ниже примере PurchaseId - это столбец Identity.

purchase.PurchaseId = 6;
_dbContext.Purchases.Add(purchase);
_dbContext.SaveChanges();

При сохранении изменений в база данных, которую EF Core выдает Microsoft.EntityFrameworkCore.DbUpdateException с ошибкой Cannot insert explicit value for identity column in table 'Purchases' when IDENTITY_INSERT is set to OFF..

Таким образом, по умолчанию вы не можете присвоить значение.

Но здесь проблема не в этом.

Более серьезная проблема заключается в том, что вы открываете классы домена своему клиенту. Этот недостаток в дизайне API может привести не только к этой проблеме.

Вы должны создать DTO, например CreateItemDTO, единственная обязанность которого - содержать все методы, необходимые для создания элемента в базе данных.

Точно так же вы не должны раскрывать класс Item в запросе GET. Это приводит к проблеме, когда отображаются столбцы, связанные с API, которые не предназначены для клиентов. Создайте GetItemDTO, который будет содержать только информацию, которая важна для запроса GET.

CreateItemDTO

public class CreateItemDTO
{
    [Required(ErrorMessage = "You must provide a name.")]
    [MaxLength(255)]
    public string Name { get; set; }
}

Чтение Предоставление моделей домена через API для получения дополнительной информации.

...