Ho una classe Project
che contiene una raccolta di 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;
}
}
La mia classe AppUser
public class AppUser : IdentityUser
{
//add properties here later
}
Voglio essere in grado di avere la capacità di qualsiasi AppUser
specifico di essere all'interno dei ProjectManagers
di più di un Project
. Aggiungo AppUser
a qualsiasi Project.ProjectManagers
tramite il mio metodo di repository:
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();
}
}
Funziona la prima volta che AppUser
viene aggiunto a una raccolta Project.ProjectManagers
. Tuttavia, questo non funzionerà se provo ad aggiungerli a qualsiasi altra raccolta Project.ProjectManagers
. Se vengono assegnati a qualsiasi Project.ProjectManagers
successivo, viene visualizzato un errore di chiave primaria perché si trovano già nel database in un progetto diverso.
"SqlException: violazione del vincolo PRIMARY KEY 'PK_AppUser'. Impossibile inserire la chiave duplicata nell'oggetto 'dbo.AppUser'. Il valore della chiave duplicata è (xxxx)."
Si prega di scrivere il codice come segue:
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();
}
}
}