Starting with your edit:
// GET: PontosDeColeta/Edit/5
public ActionResult Edit(Guid? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
// Estou modificando esta linha
var pontoDeColeta = db.PontoDeColeta
.Include(pc => pc.PontosDeColetaTiposDeLixo.Select(pctl => pctl.TipoDeLixo))
.FirstOrDefault(pc => pc.Id == id);
if (pontoDeColeta == null)
{
return HttpNotFound();
}
pontoDeColeta.UsuarioResponsavel = User.Identity.GetUserId();
// Aqui também.
ViewBag.Lixo = db.TiposDeLixo.ToList();
return View(pontoDeColeta);
}
No POST
:
[HttpPost]
[ValidateAntiForgeryToken]
// Atenção ao Bind!
public ActionResult Edit([Bind(Include = "Id,NomePopular,Endereco,Cidade,Estado,Latitude,Longitude,InfoAdicional,Ativo,Apelido,UsuarioResponsavel,PontosDeColetaTiposDeLixo")] PontoDeColeta pontoDeColeta)
{
if (ModelState.IsValid)
{
db.Entry(pontoDeColeta).State = EntityState.Modified;
db.SaveChanges();
// Tipos de Lixo Originais
var tiposDeLixoOriginais = db.PontosDeColetaTiposDeLixo.AsNoTracking().Where(pctl => pctl.Id == pontoDeColeta.Id).ToList();
// Tipos de Lixo Excluídos
foreach (var tipoDeLixoOriginal in tiposDeLixoOriginais)
{
if (!pontoDeColeta.PontosDeColetaTiposDeLixo.Any(pctl => pctl.PontoDeColetaTipoDeLixoId == tipoDeLixoOriginal.PontoDeColetaTipoDeLixoId))
{
var tipoDeLixoExcluido = db.PontosDeColetaTiposDeLixo.Single(pctl => pctl.Id == tipoDeLixoOriginal.Id);
db.PontosDeColetaTiposDeLixo.Remove(tipoDeLixoExcluido);
db.SaveChanges();
}
}
// Tipos de Lixo Inseridos
foreach (var tipoDeLixo in pontoDeColeta.PontosDeColetaTiposDeLixo)
{
if (!tiposDeLixoOriginais.Any(pctl => pctl.Id == tipoDeLixo.Id))
{
// Tipo de Lixo associado não existe ainda. Inserir.
tipoDeLixo.PontoDeColetaId = pontoDeColeta.Id;
db.PontosDeColetaTiposDeLixo.Add(tipoDeLixo);
}
db.SaveChanges();
return RedirectToAction("Index");
}
// Se a atualização falhar, você precisa carregar de novo os tipos de lixo.
ViewBag.Lixo = db.TiposDeLixo.ToList();
return View(pontoDeColeta);
}