Array
(
)

MVC 4 - Entity Framework - Many To Many

Thomás Moreira
   - 17 dez 2013

Bom dia amigos.
Estou com o seguinte problema:
Tenho um entidade "Grupo" e uma entidade "Usuario". Entre elas existe um relacionamento N pra N. Ou seja, na entidade "Grupo" tenho uma Collection de "Usuario" (Usuarios) e na entidade "Usuario" tenho uma Collection de "Grupo" (Grupos).
Como estou utilizando Migrations para gerar o banco de dados, eu não tenho uma entidade especifica para tratar esse relacionamento. Pelo que pesquisei, tenho que tratar o relacionamento com as Collections Grupos e Usuarios, mas não estou conseguindo fazer isso.
Vi vários exemplos na internet, tratando o CRUD de um relacionamento N pra N com checkboxes. No meu caso, não quero usar checkbox.
Meu cenário é o seguinte:
Um grid (kendo ui grid) que lista todos os Grupos Cadastrados. Ao escolher um Grupo e pedir para "Editar" é mostrada uma tela com um TabStrip com 2 abas. Uma aba mostrando o formulario de edição dos dados do Grupo e outra aba com um grid mostrando todos os usuários vinculados a esse Grupo. Nessa mesma aba tenho um MultSelectList para escolher os Usuários que eu quero vincular ao Grupo.
Minha dúvida é: Como fazer para enviar para o Controller, alem do model, os usuarios que eu escolhi para vincular ao grupo? Atualmente eu consigo enviar apenas o model.
Desde já agradeço!

Joel Rodrigues
   - 17 dez 2013

Pesquise sobre ViewModels, talvez lhe sirva neste caso.

Thomás Moreira
   - 17 dez 2013

Joel,

Valeu pela dica! As coisas estão começando a clarear.

Agora estou com a seguinte situação.

Ao mandar excluir um determinado usuario do grupo, o mesmo é excluído apenas na tela. A exclusão não é refletida no banco da dados.

Abaixo o código:

1. Repositorio Generico:

public class BaseBusiness<T> : IBusiness<T> where T:EntidadeBase
{

protected GuardDBContext _Context;

public BaseBusiness(GuardDBContext contextParam)
{
_Context = contextParam;
}

public IQueryable<T> Consultar
{
get { return from o in _Context.Set<T>() select o; }
}

public virtual void Inserir(T entidade)
{
_Context.Entry(entidade).State = EntityState.Added;
_Context.SaveChanges();
}

public virtual void Alterar(T entidade)
{
_Context.Entry(entidade).State = EntityState.Modified;
_Context.SaveChanges();
}

public virtual void Excluir(string Id)
{
var entidadeExcluir = Consultar.FirstOrDefault(o => o.sId == Id);
_Context.Set<T>().Remove(entidadeExcluir);
_Context.SaveChanges();

}

public virtual void Excluir(T entidade)
{
_Context.Set<T>().Remove(entidade);
_Context.SaveChanges();

}

public T RetornarPorId(string Id)
{
return Consultar.FirstOrDefault(o => o.sId == Id);
}

public IQueryable<T> RetornarTodos()
{
return Consultar;
}
}

2. Codigo para excluir

var grupo = _grupoBusiness.RetornarPorId(grupoid);
var usuarioExcluir = _usuarioBusiness.RetornarPorId(usuarioid);

grupo.Usuarios = usuarioBussiness.RetornarUsuariosPorGrupo(grupoid)
grupo.Usuarios.Remove(usuarioExcluir);

_grupoBusiness.Alterar(grupo);

Joel Rodrigues
   - 17 dez 2013

Você chegou a depurar para ter uma ideia de onde está a falha?
Coloque um breakpoint no trecho onde é feita a exclusão e analise o fluxo do código.