Добавление элемента в свойство навигации коллекции в EF Core - PullRequest
1 голос
/ 15 марта 2019

У меня есть класс Project, который содержит коллекцию AppUsers

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

    public virtual ICollection<AppUser> ProjectManagers { get; set; }

    public bool UserIsAlreadyPM(string userId)
    {
        foreach(AppUser user in this.ProjectManagers)
        {
            if(user.Id == userId)
            {
                return true;
            }
        }
        return false;
    }
}

Мой AppUser класс

public class AppUser : IdentityUser
{
    //add properties here later
}

Я хочу иметь возможностьдля любого конкретного AppUser должно быть в пределах ProjectManagers более чем одного Project.Я добавляю AppUser к любому Project.ProjectManagers с помощью моего метода хранилища:

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();
      }
}

Это работает при первом добавлении AppUser в коллекцию Project.ProjectManagers.Однако это не сработает, если я попытаюсь добавить их в любую другую коллекцию Project.ProjectManagers.Если они назначены любому последующему Project.ProjectManagers, я получаю ошибку первичного ключа, потому что они уже находятся в базе данных в другом проекте.

"SqlException: Нарушение ограничения PRIMARY KEY 'PK_AppUser'. Невозможно вставить дубликат ключав объекте 'dbo.AppUser'. Дублирующее значение ключа (xxxx). "

1 Ответ

1 голос
/ 15 марта 2019

Пожалуйста, напишите свой код следующим образом:

public void AddProjectManager(int projectID, AppUser user)
{
        Project proj = context.Projects.Include(p => p.ProjectManagers)
                              .FirstOrDefault(p => p.ProjectID == projectID);

        if(!proj.ProjectManagers.Any(pm => pm.Id = user.Id)) // <-- Here check that `AppUser` already not in Project's `ProjectManagers` collection
        {
            AppUser appUser =  context.AppUsers.FirstOrDefault(p => p.Id== user.Id);
            if(appUser != null) // <-- Confirm that the `AppUser` you are trying to add to Project's `ProjectManagers` collection is already exist in database
            {
                proj.ProjectManagers.Add(appUser);
                context.SaveChanges();
            }
        }
 }
...