post DTO в таблицу, которая является типом DbEntity в asp.net

#c# #asp.net #asp.net-web-api #model #dto

#c# #asp.net #asp.net-web-api #Модель #dto

Вопрос:

Может кто-нибудь помочь мне опубликовать DTO в таблице, которая имеет тип DbEntity?

в моем контексте у меня есть таблица категорий, которая является типом категории (DbEntity) :

 public DbSet<Category> Categories {get;set;} 

  

в моем сервисе я хочу опубликовать новую категорию в таблице Categories, но я хочу использовать свой DTO вместо своего DbEntity:

  public async Task<CategoryDTO> CreateCategory(CategoryDTO category)
 {
     await _context.Categories.AddAsync(category).Select(c => new CategoryDTO
     {
         CategoryId = c.CategoryId, 
         CategoryName = c.CategoryName
                
     }).SaveChangesAsync();
          
     return category;         
 } 
  
  

Я получаю сообщение об ошибке, потому что таблица категорий — это тип DbEntity, и я хочу добавить категорию, которая является типом CategoryDTO, т.е. объектом передачи данных. Я попытался перевести свой DbEntity в DTO с помощью select, но это не сработало. кто-нибудь может помочь мне преобразовать типы и правильно добавить мою новую категорию в базу данных?

это также мой контроллер:

         [HttpPost]
        public async Task<ActionResult> Post(CategoryDTO category)
        {
            if (category == null)
            {
                return NotFound();
            }

            if (!ModelState.IsValid) 
            {
                return BadRequest(ModelState); 
            }

            await _service.CreateCategory(category);
            return Ok(category);
        }
  

Комментарии:

1. спасибо за ответ. На самом деле мне нужно использовать DTO вместо DbEntity.

2. Это не имеет смысла. Если вы пытаетесь вставить в базу данных, то для этого необходимо создать экземпляр класса модели базы данных. Вы должны преобразовать из DTO в класс базы данных. Так что на самом деле я был не совсем прав раньше, извините. Вы должны измениться .AddAsync(category) , чтобы отправить ему объект DB вместо DTO.

3. да, я думаю, я должен сделать это для метода post.

4. Метод post в порядке. Вы должны отправить DTO туда. Преобразовать ее нужно только тогда, когда вы хотите поместить ее в базу данных. Хорошей практикой является использование DTO и объектов базы данных в качестве отдельных классов

5. PS Если вы не хотите писать весь код преобразования вручную, вы можете использовать что-то вроде Automapper , чтобы упростить преобразование между DTO и объектами базы данных.

Ответ №1:

Наконец, я решил это так:

 public async Task <CategoryDTO> CreateCategory(CategoryDTO category)
{  
    Category myCategory = new Category()
    {    
         CategoryName = category.CategoryName
    };

    await _context.Categories.AddAsync(myCategory);

    await _context.SaveChangesAsync();//Save the changes
     
    //pass CategoryId back with DTO  
    category.CategoryId = myCategory.CategoryId;
            
    return category;         
}