【问题标题】:Breeze BeforeSaveEntities: how to modify savemapBreeze BeforeSaveEntities:如何修改保存图
【发布时间】:2013-08-02 02:33:23
【问题描述】:

我从the Breeze documentation about BeforeSaveEntities读到以下内容:

“可以在此方法返回的地图中添加或删除实体”。

所以我想我可以向 saveMap 添加一个新的 EntityInfo 实例。 我的问题是:我该怎么做?在任何地方都有这样的例子吗?

我可以完美地遍历字典。但是由于 EntityInfo 没有构造函数,而且它的所有字段都是 get only,所以我觉得有点卡在这里。欢迎任何帮助。

谢谢

【问题讨论】:

  • 为什么不直接将新对象添加到您的 DbContext 中?
  • 这就是我现在正在做的事情。但是当然,在 Breeze 控制器中调用 SaveChanges 会返回一个包含 0 个实体的 SaveResult。所以我想知道是否真的可以按照文档中的建议向 saveMap 添加一些东西。

标签: breeze


【解决方案1】:

好的,这是一个非常人为的 BeforeSaveEntities 覆盖示例,它在通常保存的内容旁边创建评论记录。评论记录包括基于 SaveOptions.Tag 属性值生成的评论。

protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type,   List<EntityInfo>> saveMap) {
    var comment = new Comment();
    var tag = ContextProvider.SaveOptions.Tag;
    comment.Comment1 = (tag == null) ? "Generic comment" : tag.ToString();
    comment.CreatedOn = DateTime.Now;
    comment.SeqNum = 1;
    var ei = ContextProvider.CreateEntityInfo(comment);
    List<EntityInfo> comments;
    if (!saveMap.TryGetValue(typeof(Comment), out comments)) {
      comments = new List<EntityInfo>();
      saveMap.Add(typeof(Comment), comments);
    }
    comments.Add(ei);

    return saveMap;
  }

}

【讨论】:

  • 谢谢! var ei = ContextProvider.CreateEntityInfo(comment);就是这样! :) 再次感谢
  • Jay,这里还是有问题。我成功地将东西添加到 saveMap 中,实际上用另一种类型的列表替换了其中的列表,并使用转换后的元素。我遇到了以下异常:“序列不包含匹配元素”。我将其追溯到 EFContextProvider.cs 中的 GetEntitySetName,var ospaceEntityType = ospaceEntityTypes.First(oet => oet.FullName == entityType.FullName);不知道为什么会这样。非常感谢您的帮助。
  • Nicolas,你能提供一个小解决方案来演示这个问题吗?这样我们就可以准确地检查正在发生的事情。谢谢。
  • 顺便把repro解决方案发到breeze@ideablade.com
  • 感谢您的提议,但我想我刚刚发现自己做错了什么。我为元数据创建了一个 DTO DbContext,为数据创建了另一个 DTO DbContext。我正在将实体从 DTO 类型转换为类型,并将其放入 saveMap 中。会不会是这里的问题?
【解决方案2】:

此答案适用于那些选择使用 objectContext 而不是 Code First 来使用 Database First 的开发人员,以及 Nicolas。

在 Debug 中使用 Breeze Source Code 后发现GetEntitySetName 方法的第 805 行 (cspaceEntityType = cspaceEntityTypes.First(et =&gt; et.FullName == entityType.FullName)

我会收到错误“序列不包含匹配元素”

我注意到我的手表内部et.FullNameentityType.FullName 没有相同的命名空间。这告诉我的同志和我,edmx 模型命名空间与对象上下文不同。

转到您的 edmx 模型,在空白处右键单击并选择属性。确保命名空间属性与您的对象上下文相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多