#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;
}