ASP.net MVC / EF4 / POCO / Repositório - Como atualizar relacionamentos?

Eu tenho um 1 .. * relacionamento entreReveja eRecomendações.

A parte relevante do meu modelo (que também é o POCO mapeado pelo EF4):

public class Review
{
   public ICollection<Recommendations> Recommendations { get; set; }
}

Em umEditar visualizaçãoeu represento oRecomendações como um conjunto de caixas de seleção.

Quando eu tento eadicione uma nova recomendação como parte da edição da Revisão (por exemplo, marque outra caixa), nada está acontecendo - e eu sei o porquê ...

Eu uso a "técnica de stub" para atualizar minhas entidades - por exemplo, eu crio uma entidade com a mesma chave, anexo ao gráfico e, em seguida, façoApplyCurrentValues. Mas isso funciona apenas para propriedades escalares, não para propriedades de navegação.

eu encontreiesta pergunta StackOverflow o que parece bom, mas estou tentando descobrir como fazer isso funcionar com o POCO / Repository (e ASP.NET MVC - contexto desanexado).

Como eu estou usando POCO,review.Recommendations é umICollection<Recommendation>então eu não posso fazerreview.Recommendations.Attach. Também não estou usando entidades de rastreamento automático, por isso preciso trabalhar manualmente com o rastreamento de gráfico / alteração - o que não foi um problema até agora.

Para que você possa visualizar o cenário:

Reveja:

Recomendações (ICollection<Recommendation>):RecomendaçãoOne (Recommendation)RecomendaçãoDois (Recommendation)

Se estiver na visualização de edição, duas das caixas de seleção já estão marcadas. O terceiro (representando a Recomendação Três) édesmarcado.

Mas se eu marcar essa caixa, o modelo acima será:

Reveja:

Recomendações (ICollection<Recommendation>):RecomendaçãoOne (Recommendation)RecomendaçãoDois (Recommendation)RecomendaçãoTrês (Recommendation)

Então, eu preciso anexar o ReferenceThree ao gráfico como umnova entidade.

Preciso de campos ocultos para comparar os dados postados com a entidade existente? Ou devo armazenar a entidade no TempData e compará-la com a entidade lançada?

EDITAR

Para evitar confusão, aqui está a chamada completa da pilha de aplicativos:

ReviewController

[HttpPost]
public ActionResult Edit(Review review)
{
   _service.Update(review); // UserContentService
   _unitOfWork.Commit();
}

UserContentService

public void Update<TPost>(TPost post) where TPost : Post, new()
{
   _repository.Update(post); // GenericRepository<Post>
}

GenericRepository - usado comoGenericRepository<Post>

public void Update<T2>(T2 entity) where T2 : class, new()
{
   // create stub entity based on entity key, attach to graph.

   // override scalar values
   CurrentContext.ApplyCurrentValues(CurrentEntitySet, entity);
}

Então oUpdate (ouAdd ouDelete) Os métodos de repositório precisam ser chamados para cada recomendação, dependendo de ser novo / modificado / excluído.

questionAnswers(3)

yourAnswerToTheQuestion