我在Review
和Recommendations
之间有一个1..*的关系。
这部分模型也是由EF4映射的POCO:
public class Review
{
public ICollection<Recommendations> Recommendations { get; set; }
}
在一个编辑视图中,我将推荐表示为一组复选框。
当我尝试作为编辑评论的一部分添加一个新的推荐(例如勾选另一个复选框)时,没有任何反应 - 我知道原因是什么...
我使用“存根技术”来更新实体 - 例如,我创建一个具有相同键的实体,将其附加到图中,然后执行ApplyCurrentValues
。但这仅适用于标量属性,而不适用于导航属性。
我在StackOverflow的这个问题中找到了很好的答案,但我正在努力弄清楚如何使用POCO / Repository(以及ASP.NET MVC - 分离的上下文)使其工作。
由于我使用的是POCO,因此review.Recommendations
是一个ICollection<Recommendation>
,因此我无法执行review.Recommendations.Attach
。我也没有使用自跟踪实体,因此需要手动处理图形/更改跟踪 - 直到现在都没有问题。
因此,您可以想象场景:
评论:
- 推荐(
ICollection<Recommendation>
):- 推荐1(
Recommendation
) - 推荐2(
Recommendation
)
- 推荐1(
如果我在编辑视图上,两个复选框已经被选中。第三个(代表推荐3)是未选中的。
但是,如果我勾选该框,则以上模型变为:
评论:
- 推荐(
ICollection<Recommendation>
):- 推荐1(
Recommendation
) - 推荐2(
Recommendation
) - 推荐3(
Recommendation
)
- 推荐1(
因此,我需要将推荐3作为新实体附加到图中。
我需要隐藏字段来比较已发布数据与现有实体吗?还是应该将实体存储在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<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);
}
因此,需要为每个建议调用“更新”(或“添加”或“删除”)存储库方法,具体取决于它是新的/修改的/已删除的。
TryUpdateModel
重载。上面只是一个简单的例子。 - RPM1984