2015-02-12 4 views
0

Итак, я нахожусь в центре проекта, где мне нужно иметь отношения «Много-ко-многим» между командами и членами.От многих до многих отношений на MVC5

У одной команды может быть много пользователей (из aspnetusers), и у пользователя может быть 0 или более команд.

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

я достиг этой точки благодаря http://cpratt.co/associating-related-items-in-a-collection-via-a-listbox/

My Model Team:

public class EquipaModel 
    { 
     [Key] 
     public int EquipaID { get; set; } 
     [Required] 
     [Display (Name="Nome")] 
     public string EquipaNome { get; set; } 
     [Required] 
     [Display (Name="Descrição")] 
     public string EquipaDescricao { get; set; } 
     [Display(Name = "Team Manager")] 
     public string TeamManagerId { get; set; } 
     public virtual ApplicationUser TeamManager { get; set; } 

     public virtual ICollection<ApplicationUser> Membros { get; set; } 
    } 

Моя расширенная модель пользователя

public class ApplicationUser : IdentityUser 
    { 
     public async Task<ClaimsIdentity> 
      GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
     { 
      var userIdentity = await manager 
       .CreateIdentityAsync(this, 
        DefaultAuthenticationTypes.ApplicationCookie); 
      return userIdentity; 
     } 

     public virtual Utilizador Utilizador { get; set; } 

    } 

    [Table("Utilizadores")] 
    public class Utilizador 
    { 
     public int Id { get; set; } 
     public string PrimeiroNome { get; set; } 
     public string Apelido { get; set; } 
     public int Pontuacao { get; set; } 
     public int PaisID { get; set; } 
     public virtual PaisModel Pais { get; set; } 
     //public IEnumerable<LinguasProgModel> Linguagens { get; set; } 

    } 

My Team ViewModel

public class EquipasViewModel 
    { 
     [Required] 
     public string EquipaNome { get; set; } 
     public string EquipaDescricao { get; set; } 
     public string TeamManagerId { get; set; } 
     public virtual ApplicationUser TeamManager { get; set; } 
     [Required] 
     public List<string> MembrosID { get; set; } 
     public IEnumerable<SelectListItem> MembrosEscolhidos { get; set; } 
    } 

Моя страница на EquipaController (TeamController)

public ActionResult Create() 
     { 
      ViewBag.TeamManagerId = new SelectList(db.Users, "Id", "Email"); 

      var model = new EquipasViewModel(); 

      PopulateMembrosEscolhidos(model); 
      return View(model); 
     } 

     [HttpPost] 
     public ActionResult Create(EquipasViewModel model) 
     { 
      if (ModelState.IsValid) 
      { 

       var equipa = new EquipaModel 
       { 
        EquipaNome = model.EquipaNome, 
        EquipaDescricao = model.EquipaDescricao, 
        TeamManagerId = model.TeamManagerId, 
        Membros = db.Users.Where(m => model.MembrosID.Contains(m.Id)).ToList() 
       }; 

       db.Equipas.Add(equipa); 
       db.SaveChanges(); 

       return RedirectToAction("Index"); 
      } 

      ViewBag.TeamManagerId = new SelectList(db.Users, "Id", "Email", model.TeamManagerId); 

      PopulateMembrosEscolhidos(model); 
      return View(model); 
     } 

и, наконец, правка мой контроллер команды

public ActionResult Edit(string id) 
     { 
      ViewBag.TeamManagerId = new SelectList(db.Users, "Id", "Email"); 

      var equipa = db.Equipas.FirstOrDefault(e => e.EquipaNome == id); 
      if (equipa == null) 
      { 
       return new HttpNotFoundResult(); 
      } 

      var model = new EquipasViewModel 
      { 
       EquipaNome = equipa.EquipaNome, 
       EquipaDescricao = equipa.EquipaDescricao, 
       MembrosID = equipa.Membros.Select(m => m.Id).ToList() 
      }; 

      PopulateMembrosEscolhidos(model); 
      return View(model); 
     } 

     [HttpPost] 
     public ActionResult Edit(string id, EquipasViewModel model) 
     { 
      var equipa = db.Equipas.FirstOrDefault(e => e.EquipaNome == id); 
      if (equipa == null) 
      { 
       return new HttpNotFoundResult(); 
      } 

      if (ModelState.IsValid) 
      { 
       equipa.EquipaNome = model.EquipaNome; 
       equipa.EquipaDescricao = model.EquipaDescricao; 


       equipa.Membros.Where(m => !model.MembrosID.Contains(m.Id)) 
        .ToList() 
        .ForEach(m => equipa.Membros.Remove(m)); 

       var MembrosNaEquipa = equipa.Membros.Select(m => m.Id); 
       var NovosMembros = model.MembrosID.Except(MembrosNaEquipa); 
       db.Users.Where(m => NovosMembros.Contains(m.Id)) 
        .ToList() 
        .ForEach(m => equipa.Membros.Add(m)); 

       db.Entry(equipa).State = EntityState.Modified; 
       db.SaveChanges(); 

       return RedirectToAction("Index"); 
      } 

      PopulateMembrosEscolhidos(model); 
      return View(model); 
     } 

В какой-то момент, я иду удалить список избранного и заменить его на текстовое поле, где пользователь вводит имена пользователей для добавления в список участников команды, но на Я просто пытаюсь выяснить, как сохранить отношения «многие ко многим».

Редактировать

У меня было чувство, что это было что-то простое, но просто не мог попасть. Я начал использовать это решение, но обнаружил ошибку, которая, если честно, я никогда раньше не видел.

Multiplicity constraint violated. The role 'ApplicationUser_Equipas_Source' of the relationship 'Codings.Models.ApplicationUser_Equipas' has multiplicity 1 or 0..1. 

Это происходит на линии "db.Equipas.Add (equipa);" Создать.

Это, наверное, моя ошибка, так как я пытался добавить команду к пользователям просто

var MembrosEscolhidos = db.Users.Where(m => model.MembrosID.Contains(m.Id)).ToList(); 

foreach (var item in MembrosEscolhidos) 
       { 
        item.Equipas.Add(equipa); 
       } 
+0

Вы видите, как вы ссылаетесь на пользователей в вашей модели команд, например. «public virtual ICollection Membros {get; set;}» ... почему бы не сделать то же самое в вашей модели пользователей, но ссылаться на модель команд с помощью: «public virtual ICollection Команды {get; set;}» или там что-то мне не хватает? –

ответ

0

Я думаю, что один легко исправить будет ссылаться на ваш EquipaModel как коллекции в вашей таблице пользователей.

например.

public virtual ICollection<EquipaModel> Equipas { get; set; } 

как вы ссылаетесь пользователей в вашем EquipaModel

например

public class EquipaModel 
{ 
    ... 
    public virtual ICollection<ApplicationUser> Membros { get; set; } 
} 

Тогда ваши пользователи могут иметь много «Equipas» или команд.

+0

Это имеет смысл, конечно, не знаю, почему я об этом не думал, хотя, как я уже сказал в своем редактировании, возникла другая проблема: | –

+0

Хорошо, так что это другая проблема, чем та, которую вы изначально имели ... попробуйте это для проблемы, с которой вы сейчас сталкиваетесь: http://stackoverflow.com/questions/20034003/multiplicity-constraint-violated-entity-framework-5. .. –

Смежные вопросы