Отношения один-ко-многим с Web API не работают - PullRequest
0 голосов
/ 24 марта 2020

У меня есть класс UserData, который содержит всю информацию о пользователе, например, имя, возраст, рост, вес и т. Д. c. У меня также есть класс WorkoutData, который содержит всю информацию о тренировках в тренажерном зале, например, дату, продолжительность тренировки, подробности тренировки, сожженные калории и т. Д. c.

Пользователь может иметь много личных тренировок, связанных с ним, поэтому он также имеет список WorkoutData, который представляет всех пользователей, прошедших тренировки.

Когда пользователь добавляет (публикует) тренировку, мне нужно добавить тренировку в список в объекте UserData, поэтому, когда я получу пользователя, он покажет все тренировки пользователей из списка. Хотя я не совсем уверен, как это сделать, или правильный способ сделать это.

UserData и WorkoutData:

namespace FitnessTracker
{
    //holds all user information
    public class UserData
    {
        //Upper bounds for BMI categories
        const double SeverelyUnderweightUpper = 15.9;
        const double UnderweightUpper = 18.4; 
        const double NormalWeightUpper = 24.9;
        const double OverweightUpper = 29.9;
        const double ModeratelyObeseUpper = 34.9;

        public int ID { get; set; }
        [Required(ErrorMessage = "First Name is required")]
        [Display(Name = "First Name")]
        [StringLength(20, ErrorMessage = "First name cannot exceed 20 characters. ")]
        public string FirstName { get; set; }
        [Required(ErrorMessage = "Second Name is required")]
        [Display(Name = "Second Name")]
        [StringLength(20, ErrorMessage = "Second name cannot exceed 20 characters. ")]
        public string SecondName { get; set; }
        public string Gender { get; set; }
        [Range(5, 110, ErrorMessage = "Please enter a valid age. ")]
        public int Age { get; set; }
        [Display(Name = "Weight (KG)")]
        [Range(5, 150, ErrorMessage = "KG must be between 5 and 150")]
        public double WeightKG { get; set; }
        [Display(Name = "Height (CM)")]
        [Range(5, 220, ErrorMessage = "Height must be between 5 and 220 CM")]
        public int HeightCM { get; set; }

        //returns a value for user BMR
        public double BMR
        {
            get
            {
                double bmr = (10 * WeightKG) + (6.25 * HeightCM) - (5 * Age) - 161;
                return bmr;
            }
        }

        //show current saved stats, allow to change to up-do-date stats - check BMR/BMI 
        //return a value for user BMI
        public double BMIValue
        {
            get
            {
                double bmi = (WeightKG / HeightCM / HeightCM) * 10000;
                return bmi;
            }
        }


        public string BMICategory
        {

            get
            {
                double userBMI = this.BMIValue;
                if(userBMI <= SeverelyUnderweightUpper)
                {
                    return "Severely Underweight";
                }
                else if(userBMI <= UnderweightUpper)
                {
                    return "Underweight";
                }
                else if(userBMI <= NormalWeightUpper)
                {
                    return "Normal";
                }
                else if(userBMI <= OverweightUpper)
                {
                    return "Overweight";
                }
                else if(userBMI <= ModeratelyObeseUpper)
                {
                    return "Moderately Obese";
                }
                else
                {
                    throw new Exception("BMI Category Error");
                }
            }
        }




        //Users list of personal workouts
        public List<WorkoutData> Workouts { get; set; }

    }
    //holds all workout information such as start/end times, workout details, calories burned etc.
    public class WorkoutData
    {
        public int ID { get; set; }
        [Required(ErrorMessage = "Date of workout is required")]
        public DateTime Date { get; set; }
        [Display(Name = "Workout Length")]
        public double WorkoutDuration { get; set; }
        [Display(Name = "Workout Details")]
        public string WorkoutDetails { get; set; }
        [Display(Name = "Calories Burned")]
        public int CaloriesBurned { get; set; }       
        public UserData User { get; set; }
    }

}

Мой метод get UserDataController (мне нужно это, чтобы отобразить всех пользователей информация и все тренировки пользователей из списка):

 [HttpGet]
        public async Task<ActionResult<IEnumerable<UserData>>> GetUsers()
        {
            return await _context.Users.Include(r => r.Workouts).ToListAsync();
        }

Мой метод публикации WorkoutDataController:

[HttpPost]
    public async Task<ActionResult<WorkoutData>> PostWorkoutData(WorkoutData workoutData)
    {
        _context.Workouts.Add(workoutData);
        await _context.SaveChangesAsync();



        return CreatedAtAction("GetWorkoutData", new { id = workoutData.ID }, workoutData);
    }

Может кто-нибудь сказать мне, как добавить тренировку в список пользователей в списке вышеуказанный метод сообщения? Или, если я должен сделать это по-другому, пожалуйста, сообщите

1 Ответ

2 голосов
/ 24 марта 2020

Вы должны добавить свойство внешнего ключа для пользователя в свой класс WorkoutData.

public int UserID { get; set; }

Затем, когда вы добавите WorkoutData в действие API, явно установите, что UserID и EF позаботятся о связывании , С этой навигационной ссылкой ваше предложение Include в методе GetUsers () должно правильно включать соответствующие данные WorkoutData для каждого пользователя.

...