Создание записи¶
Необходимо дать пользователю создавать рецепты в приложении. Для этих целей будет служить форма, реализованая при помощи тег-хелперов. Ее содержимое отправляется на страницу Create.cshtml, на которой происходит валидация переданных данных, и, при успешной валидации, вызывается сервис RecipeService для создания нового объекта Recipe в БД, последовательность действий изображена на рисунке.

Создание сущности в EF Core включает в себя добавление новой строки в отображаемую таблицу. Также будут корректно добавлены связанные сущности Ingredients.
Вот код метода:
readonly AppDbContext _context; //внедряется в конструктор
public async Task<int> CreateRecipe(CreateRecipeCommand cmd)
{
var recipe = new Recipe
{
Name = cmd.Name,
TimeToCook = new TimeSpan(cmd.TimeToCookHrs, cmd.TimeToCookMins, 0),
Method = cmd.Method,
IsVegetarian = cmd.IsVegetarian,
IsVegan = cmd.IsVegan,
Ingredients = cmd.Ingredients?.Select(i =>
new Ingredient
{
Name = i.Name,
Quantity = i.Quantity,
Unit = i.Unit
}).ToList()
};
_context.Add(recipe); //Сообщаем EF Core, что нужно отслеживать новые сущности
await _context.SaveChangesAsync(); //Запишем в БД
return recipe.RecipeId; //поле RecipeId заполняется EF Core при сохранении
}
Здесь выполняются три шага:
- создаем сущности
RecipeиIngredient; - добавляем их в список отслеживаемых сущностей EF Core;
- вызываем
_context.SaveChangesAsync(), чтобы выполнить командуINSERTи добавить строки в таблицыRecipeиIngredient.
Если при взаимодействии с БД возникает проблема — например, не запущены миграции и БД не обновлена, — будет выброшено исключение. Это нужно учитывать в реальном коде.
Если же всё прошло удачно, EF Core обновит все автоматически сгенерированные идентификаторы (RecipeId для Recipe, IngredientId для Ingredient). Можно вернуть идентификатор головной сущности на страницу Razor.
Дата создания : 2 октября 2022 г.