У меня есть соотношение 1... * между Обзор и Рекомендациями.
Соответствующая часть моей модели (которая также является POCO, отображаемой EF4):
public class Review
{
public ICollection<Recommendations> Recommendations { get; set; }
}
В Редактировать вид я представляю рекомендации как набор флажков.
Когда я пытаюсь и добавить новую Рекомендацию как часть редактирования обзора (например, отметьте другое поле), ничего не происходит - и я знаю, почему...
Я использую "метод заглушки" для обновления моих объектов - например, я создаю объект с тем же ключом, присоединяю его к графику, а затем ApplyCurrentValues
. Но это работает только для скалярных свойств, а не для навигационных свойств.
Я нашел qaru.site/info/45967/..., который выглядит хорошо, но я пытаюсь выяснить, как заставить это работать с POCO/Repository (и ASP.NET MVC - удаленный контекст).
Поскольку я использую POCO, review.Recommendations
является ICollection<Recommendation>
, поэтому я не могу сделать review.Recommendations.Attach
. Я тоже не использую Self-Tracking Entities, поэтому мне нужно вручную работать с отслеживанием графика/изменения, что до сих пор не было проблемой.
Итак, вы можете визуализировать сценарий:
Обзор:
- Рекомендации (
ICollection<Recommendation>
):- РекомендацияOne (
Recommendation
) - Рекомендация 2 (
Recommendation
)
- РекомендацияOne (
Если im в представлении редактирования, два флажка уже отмечены. Третий (представляющий рекомендациюThree) не отмечен.
Но если я установил этот флажок, указанная выше модель станет следующей:
Обзор:
- Рекомендации (
ICollection<Recommendation>
):- РекомендацияOne (
Recommendation
) - Рекомендация 2 (
Recommendation
) - РекомендацияТри (
Recommendation
)
- РекомендацияOne (
И поэтому мне нужно привязать RecommendationThree к графику как новый объект.
Нужны ли мне скрытые поля для сравнения опубликованных данных с существующим объектом? Или я должен сохранить объект в TempData и сравнить его с опубликованным объектом?
ИЗМЕНИТЬ
Чтобы избежать путаницы, вот полный вызов стека приложений:
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
)), в зависимости от того, что это новое/измененное/удаленное.