У меня 1 .. * отношение между Отзывом и Рекомендациями .
Соответствующая часть моей модели (которая также является POCO, отображаемой EF4):
public class Review
{
public ICollection<Recommendations> Recommendations { get; set; }
}
В представлении Edit я представляю Рекомендации в виде набора флажков.
Когда я пытаюсь добавить новую Рекомендацию как часть редактирования Обзора (например, установите другой флажок), ничего не происходит - и я знаю, почему ...
Я использую «метод заглушки» для обновления своих сущностей - например, я создаю сущность с тем же ключом, прикрепляю ее к графику, затем выполняю ApplyCurrentValues
. Но это работает только для скалярных свойств, но не для навигационных свойств.
Я нашел этот вопрос StackOverflow , который выглядит хорошо, но я пытаюсь выяснить, как заставить его работать с POCO / Repository (и ASP.NET MVC - отдельный контекст).
Поскольку я использую POCO, review.Recommendations
- это ICollection<Recommendation>
, поэтому я не могу сделать review.Recommendations.Attach
. Я также не использую Self-Tracking Entities, поэтому мне нужно вручную работать с графиком / отслеживанием изменений - что до сих пор не было проблемой.
Таким образом, вы можете визуализировать сценарий:
Отзыв:
- Рекомендации (
ICollection<Recommendation>
):
- Рекомендация одна (
Recommendation
)
- Рекомендация два (
Recommendation
)
Если я в режиме редактирования, два флажка уже отмечены. Третий (представляющий собой Третий) - не проверен .
Но если я поставлю этот флажок, приведенная выше модель станет:
Отзыв:
- Рекомендации (
ICollection<Recommendation>
):
- Рекомендация одна (
Recommendation
)
- Рекомендация два (
Recommendation
)
- Рекомендация Три (
Recommendation
)
И поэтому мне нужно прикрепить Рекомендацию 3 к графику в виде нового объекта .
Нужны ли скрытые поля для сравнения опубликованных данных с существующим объектом? Или мне следует сохранить объект в TempData и сравнить его с опубликованным объектом?
EDIT
Чтобы избежать путаницы, вот полный вызов стека приложений:
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 - используется как GenericRepository<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);
}
Итак, методы репозитория Update
(или Add
или Delete
) необходимо вызывать для каждой рекомендации, в зависимости от того, является она новой / измененной / удаленной.