【发布时间】:2011-06-06 22:22:41
【问题描述】:
我在 Review 和 Recommendations 之间存在 1..* 关系。
我的模型的相关部分(也是EF4映射的POCO):
public class Review
{
public ICollection<Recommendations> Recommendations { get; set; }
}
在编辑视图上,我将建议表示为一组复选框。
当我尝试添加新推荐作为编辑评论的一部分(例如选中另一个框)时,什么都没有发生 - 我知道为什么......
我使用“存根技术”来更新我的实体 - 例如,我创建一个具有相同键的实体,将其附加到图形,然后执行 ApplyCurrentValues。但这仅适用于标量属性,不适用于导航属性。
我发现 this StackOverflow question 看起来不错,但我正在努力研究如何让它与 POCO/Repository(和 ASP.NET MVC - 分离上下文)一起使用。
当我使用 POCO 时,review.Recommendations 是 ICollection<Recommendation>,所以我不能这样做 review.Recommendations.Attach。我也没有使用自我跟踪实体,所以我需要手动处理图形/更改跟踪 - 直到现在这还不是问题。
因此您可以可视化场景:
评论:
- 建议 (
ICollection<Recommendation>):- RecommendationOne (
Recommendation) - RecommendationTwo (
Recommendation)
- RecommendationOne (
如果我在编辑视图中,则其中两个复选框已被选中。第三个(代表 RecommendationThree)未选中。
但是如果我选中那个框,上面的模型就变成了:
评论:
- 建议(
ICollection<Recommendation>):- RecommendationOne (
Recommendation) - RecommendationTwo (
Recommendation) - 推荐三 (
Recommendation)
- RecommendationOne (
所以我需要将 RecommendationThree 作为一个新实体附加到图表中。
我需要隐藏字段来比较现有实体的发布数据吗?还是应该将实体存储在 TempData 中并将其与发布的实体进行比较?
编辑
为避免混淆,以下是完整的应用堆栈调用:
审核控制器
[HttpPost]
public ActionResult Edit(Review review)
{
_service.Update(review); // UserContentService
_unitOfWork.Commit();
}
用户内容服务
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)存储库方法,具体取决于它是新的/修改的/删除的。
【问题讨论】:
标签: asp.net-mvc entity-framework-4 repository poco