gpt4 book ai didi

asp.net-mvc - ASP.NET MVC/EF4/POCO/Repository - 如何更新关系?

转载 作者:行者123 更新时间:2023-12-03 23:34:35 25 4
gpt4 key购买 nike

我在 之间有 1..* 关系点评 建议 .

我的模型的相关部分(也是 EF4 映射的 POCO):

public class Review
{
public ICollection<Recommendations> Recommendations { get; set; }
}

编辑查看 ,我将建议表示为一组复选框。

当我尝试 添加新推荐 作为编辑评论的一部分(例如选中另一个框),没有任何事情发生 - 我知道为什么......

我使用“ stub 技术”来更新我的实体 - 例如,我创建一个具有相同键的实体,将其附加到图形,然后执行 ApplyCurrentValues .但这仅适用于标量属性,不适用于导航属性。

我找到了 this StackOverflow question这看起来不错,但我正在尝试解决如何让它与 POCO/Repository(和 ASP.NET MVC - 分离上下文)一起使用。

当我使用 POCO 时, review.RecommendationsICollection<Recommendation> ,所以我不能做 review.Recommendations.Attach .我也没有使用自我跟踪实体,所以我需要手动处理图形/更改跟踪——直到现在这还不是问题。

所以你可以想象一下这个场景:

审查:
  • 建议(ICollection<Recommendation>):
  • 推荐一(Recommendation)
  • 推荐二(Recommendation)

  • 如果我在编辑 View 中,则其中两个复选框已被选中。第三个(代表 RecommendationThree)是 未选中 .

    但是,如果我选中该框,则上述模型将变为:

    审查:
  • 建议(ICollection<Recommendation>):
  • 推荐一(Recommendation)
  • 推荐二(Recommendation)
  • 推荐三(Recommendation)

  • 所以我需要将 RecommendationThree 作为 附加到图表中。新实体 .

    我需要隐藏字段来比较现有实体的发布数据吗?或者我应该将实体存储在 TempData 中并将其与发布的实体进行比较?

    编辑

    为避免混淆,以下是完整的应用程序堆栈调用:

    审核 Controller
    [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 (或 AddDelete )需要为每个建议调用存储库方法,具体取决于它是新的/修改的/删除的。

    最佳答案

    我接受了@jfar 的回答,因为他让我走上了正确的轨道,但我想我会在此处添加一个答案以使其他人受益。

    关系未更新的原因如下:

    1)完全断开的场景。 ASP.NET = 无状态,新的上下文更新了每个 HTTP 请求。

    2)由 MVC(模型绑定(bind))创建的编辑实体,但在图中不存在。

    3) 当使用没有变更跟踪的 POCO 时,执行 .Attach在实体上会将其添加到图表中,但实体和任何子关系将为 不变。

    4) 我使用 stub 实体技巧和ApplyCurrentValues更新实体,但这仅适用于标量属性,不适用于导航属性。

    所以 - 为了让上述工作,我必须明确设置 EntityState对于对象(由于 ApplyCurrentValues 而自动发生),还有导航属性。

    还有一个问题 - 我该怎么做 了解如果导航属性被添加/修改/删除?我没有可比较的对象 - 只有一个我知道是“编辑”的实体,但我不知道编辑了什么。

    所以最终的解决方案是这样的:

    [HttpPost]
    public ActionResult Edit(Review review)
    {
    var existingReview = _service.FindById(review.Id); // review is now in graph.
    TryUpdateModel(existingReview); // MVC equivalent of "ApplyCurrentValues" - but works for ALL properties - including navigationals
    _unitOfWork.Commit(); // save changed
    }

    就是这样。我什至不需要我的 _service.Update方法 - 因为我不再需要 stub 技巧 - 因为评论在检索图中,并且 ApplyCurrentValues替换为 TryUpdateModel .

    当然现在 - 这不是 并发证明解决方案。

    如果我加载评论编辑 View ,并且在我单击“提交”之前,其他人更改了评论,我的更改可能会丢失。

    幸运的是,我有一个“最后获胜”的并发模式,所以这对我来说不是问题。

    我喜欢 POCO,但是当你拥有无状态环境 (MVC) 和无变更跟踪的组合时,他们会很痛苦。

    关于asp.net-mvc - ASP.NET MVC/EF4/POCO/Repository - 如何更新关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4653834/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com