我的模型的相关部分(也是EF4映射的POCO):
public class Review { public ICollection<Recommendations> Recommendations { get; set; } }
在编辑视图中,我将建议视为一组复选框.
当我尝试添加一个新的建议书作为编辑审查的一部分(例如,检查另一个框),没有任何事情发生 – 我知道为什么…
我使用“stub技术”更新我的实体 – 例如我创建一个具有相同键的实体,将其附加到图形,然后执行ApplyCurrentValues.但这只适用于标量属性,而不适用于导航属性.
我发现this StackOverflow question看起来不错,但我正在努力解决如何使它与POCO / Repository(和ASP.NET MVC – 分离的上下文)一起使用.
因为我正在使用POCO,请查看.建议是ICollection<建议>所以我不能做评论.建议.我还没有使用自我跟踪实体,所以我需要手动使用图表/变更跟踪 – 直到现在还没有问题.
所以你可以可视化的场景:
评论:
>建议书(ICollection<建议书): >推荐(推荐)
推荐二(推荐)
如果在编辑视图中显示,则已选中其中两个复选框.第三个(代表“建议三”)是未经检查的.
但如果我检查那个盒子,上面的模型变成:
评论:
>建议书(ICollection<建议书): >推荐(推荐)
推荐二(推荐)
>推荐三(推荐)
因此,我需要将“建议三”作为新实体附加到图表中.
我需要隐藏的字段来比较现有实体发布的数据吗?还是应该将实体存储在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); }
解决方法
recommendations.Add(newRecomendation)
?
回覆评论:
好的,怎么了?
SomeServiceOrRepository.AddNewRecommendation( newRecommendation )
要么
SomeServiceOrRepository.AddNewRecommendation( int parentId,newRecommendation )
最后一句话你是说两个问题?
这不应该很难.
总结一下我的答案,我认为你正在做的事情是“艰难的方式”,并且应该专注于发布与您尝试完成的CRUD动作相对应的表单值.
如果一个新的实体可以与编辑的实体同时进入,那么您应该将它们前缀不同,以便模型绑定器可以在其上接收.即使有多个新项目,您可以使用相同的[0]语法在“名称”字段的前面加上新的或某些东西.
在这种情况下很多次,您不能依赖于实体框架的图形功能,因为从集合中删除实体从未意味着应将其设置为删除.
如果表单是不可变的,您还可以尝试使用ObjectSet中的生成的附加函数:
theContect.ObjectSet<Review>().Attach( review )