asp.net-mvc – ASP.NET MVC / EF4 / POCO /存储库 – 如何更新关系?

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – ASP.NET MVC / EF4 / POCO /存储库 – 如何更新关系?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
评论与建议书之间有1 .. *的关系.

我的模型的相关部分(也是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 )

多出这个方法.也许你可以发布你的控制器和查看代码

猜你在找的asp.Net相关文章