Проблемы с сохранением данных тренировок в базе данных с использованием Entity Framework Core и веб-API ASP.NET

Я столкнулся с трудностями при попытке сохранить данные тренировки в базе данных с помощью Entity Framework Core и веб-API ASP.NET. У меня есть класс Workout, определенный с такими свойствами, как WorkoutId, ExerciseTypeGroups, CreatorId, Creator и Status. Свойство ExerciseTypeGroups представляет собой список объектов ExerciseTypeGroup.

Я реализовал метод CreateAsync в своем dbContext, чтобы добавить объект Workout в базу данных и сохранить изменения с помощью SaveChangesAsync. Кроме того, у меня есть метод WorkoutManager.CreateAsync, который сериализует объект Workout в JSON и отправляет его на конечную точку сервера с помощью HTTP-запроса POST.

Вот краткое описание ключевых компонентов:

//The command initializing the data entering
public ICommand CompleteWorkoutCommand => new Command(CompleteWorkout);

private async void CompleteWorkout()
{
     Workout workout = new Workout();
     workout.ExerciseTypeGroups = new List<ExerciseTypeGroup>(ExerciseTypeGroups);
     string userIdString = Preferences.Get("UserID", defaultValue: null);

     if (int.TryParse(userIdString, out int userId))
     {
         // If parsing was successful, set the CreatorId property
         workout.CreatorId = userId;
         workout.Creator = await UserManaging.ReadAsync(userId);

         // Create the workout asynchronously
         Task.Run(() => WorkoutManager.CreateAsync(workout)).GetAwaiter().GetResult();
     }
     else
     {
         // Handle the case where parsing fails
         Console.WriteLine("Failed to parse user ID from preferences.");
         // You might want to handle this error case appropriately for your application
     }
}
// DbContext method to add Workout object to the database
public async Task CreateAsync(Workout item)
{
    try
    {
        dbContext.Workouts.Add(item);
        await dbContext.SaveChangesAsync();
    }
    catch (Exception ex)
    {
        // Handle exception
        throw;
    }
}
// Workout class definition
public class Workout
{
    [Key]
    public int WorkoutId { get; set; }
    public List<ExerciseTypeGroup> ExerciseTypeGroups { get; set; }
    public int CreatorId { get; set; }
    public User Creator { get; set; }
    public Status Status { get; set; }

    public Workout()
    {
        ExerciseTypeGroups = new List<ExerciseTypeGroup>();
    }

    public Workout(User user)
    {
        Status = Status.Waiting;
        Creator = user;
        ExerciseTypeGroups = new List<ExerciseTypeGroup>();
    }
}
// Manager method to send Workout object to server endpoint
public static async Task CreateAsync(Workout item)
{
    try
    {
        var json = JsonConvert.SerializeObject(item);
        var data = new StringContent(json, Encoding.UTF8, "application/json");
        var response = await Client._httpClient.PostAsync(Client._url + $"Workout", data);
    }
    catch (HttpRequestException e)
    {
        Console.WriteLine($"Request error: {e.Message}");
    }
}
// Server-side endpoint in ASP.NET Web API controller
[HttpPost]
public async Task Create([FromBody]Workout item)
{
    await _workoutContext.CreateAsync(item);
}

Несмотря на реализацию этих методов, я сталкиваюсь с проблемами, из-за которых данные тренировки не сохраняются в базе данных. Я убедился, что код как на стороне клиента, так и на стороне сервера выполняется без ошибок, но данные не сохраняются в базе данных.

Каковы могут быть возможные причины этой проблемы и как ее устранить и устранить? Любые идеи или предложения будут с благодарностью приняты. Если информации недостаточно вот мой гитхаб https://github.com/danchuu/Muscles_AppDR. Спасибо.

Удалите свой catch (Exception ex), потому что он не приносит никакой пользы. Что вы видите в своем отладчике? Добавьте ведение журнала SQL, чтобы вы могли видеть фактически генерируемый SQL. Используйте инструменты трассировки или профилирования вашей СУБД, чтобы увидеть, что происходит. Вы подключаетесь к нужному экземпляру базы данных? Вы используете MSSQL, MySQL/MariaDb, Postgres? И т. д?

Dai 08.04.2024 17:09

@Dai Я добавил журналирование SQL, и вот ошибка Pastebin.com/sCh3pnBi

dancho 08.04.2024 18:14

Ошибки, указанные в этом скрипте, не соответствуют ошибке в вашем сообщении.

Dai 08.04.2024 18:37

@Dai Ты имеешь в виду, что ошибка где-то еще?

dancho 08.04.2024 18:40

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

Dai 08.04.2024 21:24

Во-первых, существует исключение, поэтому утверждение «серверный код выполняется без ошибок» неверно. Во-вторых, ознакомьтесь с официальной документацией EF Core, посвященной работе с отключенными объектами. public User Creator { get; set; } вызывает проблему в данном конкретном случае, поскольку dbContext.Add помечает объект и все связанные с ним объекты для создания. Но в вашем случае User не нов. Есть способы решить эту проблему, но ни один из них не является универсальным. В общем, либо не отправляйте объект Creator, просто CreatorId, либо AttachCreator перед вызовом Add .

Ivan Stoev 09.04.2024 08:27

@dancho Ваш подход совершенно неправильный. Сначала попробуйте научиться правильно использовать EF Core entityframeworktutorial.net/efcore/entity-framework-core.asp‌​x

Darkk L 09.04.2024 09:27

@DarkkL можешь поподробнее?

dancho 10.04.2024 19:46

@IvanStoev Я рассмотрю это, но не думаю, что это моя текущая проблема. Я пробовал использовать только CreatorID, но не получилось. У вас есть другая идея?

dancho 10.04.2024 20:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключалась в том, что я давал значение null для столбца, не допускающего значения NULL, в базе данных.

Другие вопросы по теме