Добавить постоянную коллекцию объектов в другой объект в .NET Core - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь создать коллекцию из <AppUser> объектов в другом Project объекте.

Моя модель:

public class Project
    {
        public int ProjectID { get; set; }

        [Required(ErrorMessage = " Please enter a project name")]
        public string Name { get; set; }

        [Required(ErrorMessage = " Please enter a project description")]
        public string Description { get; set; }

        //HERE'S MY COLLECTION OF <APPUSER> OBJECTS
        public virtual ICollection<AppUser> ProjectManagers { get; set; }
    }

На мой взгляд, я прошу письмо, связанное сс <AppUser> для добавления в этот список.Вот модель представления, связанная с этим представлением:

public class AddProjectManagerViewModel
    {
        [Required]
        [EmailAddress(ErrorMessage = "Please ensure email is valid")]
        [UIHint("email")]
        public string Email { get; set; }

        public int ProjectID { get; set; }
    }

И представление:

@model AddProjectManagerViewModel
@{
    ViewBag.Title = "Add PM";
    Layout = "_Layout";
}
<div class="col-xs-12 buffer">
    <div class="text-center">
        <h3>Enter the new Project Manager's email:</h3>
    </div>
    <div><span asp-validation-for="Email" class="text-danger"></span></div>

    <form asp-action="AddProjectManager">
        <div class="form-group">
            <label asp-for="Email"></label>
            <input asp-for="Email" class="form-control" />
        </div>
        <div class="text-center">
            <button class="btn btn-primary" asp-route-projectId="@Model.ProjectID" type="submit">Add to PMs</button>
        </div>
    </form>
</div>

В моем контроллере у меня есть метод POST.Проблема в том, что List<AppUser> не является постоянным и отображается null каждый раз, когда вызывается метод действия:

[HttpPost]
        [Authorize]
        public async Task<IActionResult> AddProjectManager(int projectId, string email)
        {
            var pmToAdd = await userManager.FindByEmailAsync(email);
            if (pmToAdd != null)
            {
                var proj = repository.Projects.FirstOrDefault(p => p.ProjectID == projectId);
                if(proj != null)
                {
                    //HERE proj.ProjectManagers IS ALWAYS NULL EVEN IF THIS METHOD HAS BEEN PREVIOUSLY CALLED SUCCESSFULLY
                    if(proj.ProjectManagers == null) { proj.ProjectManagers = new List<AppUser>(); }
                    proj.ProjectManagers.Add(pmToAdd);
                    TempData["message"] = $"{pmToAdd.Email} added to {proj.Name} Project Managers";
                    return View("Edit", proj );
                }
                TempData["message"] = $"Error finding project in database.";
                return View();
            }
            TempData["message"] = $"User not found. Ensure that email is linked to a registered user";
            return View();

        }

Как мне настроить этот подход, чтобы сделать public virtual ICollection<AppUser> ProjectManagers { get; set; } модели постоянным?

РЕДАКТИРОВАТЬ Вот мой метод хранилища:

public void AddProjectManager(int projectID, AppUser user)
        {
            Project proj = context.Projects.FirstOrDefault(p => p.ProjectID == projectID);
            if(proj != null)
            {
                proj.ProjectManagers.Add(user);
                context.SaveChanges();
            }
        }

Я также изменил proj.ProjectManagers.Add(pmToAdd); на repository.AddProjectManager(projectId, pmToAdd); в методе действияно List<AppUser>' is still null` при каждом вызове

...