MVC 4 - Entity Framework - Many To Many
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!
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!
Thomás Moreira
Curtidas 0
Respostas
Joel Rodrigues
17/12/2013
Pesquise sobre ViewModels, talvez lhe sirva neste caso.
GOSTEI 0
Thomás Moreira
17/12/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);
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);
GOSTEI 0
Joel Rodrigues
17/12/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.
Coloque um breakpoint no trecho onde é feita a exclusão e analise o fluxo do código.
GOSTEI 0