Breeze - 已删除项目导航属性错误

2024-05-28

根据breeze api,当调用setDeleted时,它将从所有相关实体中删除该实体。这是事实,但使用实体管理器的 importEntities 函数导入已删除项目时,该行为存在缺陷。已删除的实体将清空其导航属性,但具有包含已删除项目的导航属性的其他实体将将该项目保留在其导航列表中。如果在实体上调用 setDeleted,即使实体已被删除,也会解决问题,但这不是必需的。

我已经为 DocCode 测试创建了这个测试用例。

/*********************************************************
    * Create an EM with parent/child relationship data.  Export the EM and import it into a new one, delete the child item in the exported EM
    * export the 2nd EM into the first EM.
    *********************************************************/
    test("test imported deleted nav properties", 2, function () {
        var em = newEm();

        // create a new parent Customer
        var parentCustomer = em.createEntity("Customer", {
            CustomerID: dummyCustID,
            CompanyName: 'TestCo'
        });

        // a new Order which is a child of the parent Customer
        var newOrder = em.createEntity("Order", {
            CustomerID: parentCustomer.CustomerID()
        });
        parentCustomer.entityAspect.setUnchanged();
        newOrder.entityAspect.setUnchanged();

        // clone the EM data
        var expEntities = em.exportEntities(null, true);

        //var newEm = newEm();
        var newEM = new breeze.EntityManager();
        newEM.importEntities(expEntities, { mergeStrategy: breeze.MergeStrategy.OverwriteChanges });

        // delete the order
        var newOrderCopy = newEM.getEntities("Order")[0];
        newOrderCopy.entityAspect.setDeleted();

        // export the cloned EM
        var expEntitiesNew = newEM.exportEntities();
        // merge to the original EM
        em.importEntities(expEntitiesNew, { mergeStrategy: breeze.MergeStrategy.OverwriteChanges });

        var deletedOrder = parentCustomer.Orders();

        ok(newOrder.entityAspect.entityState.isDeleted(), "newOrder should be 'deleted'");
        ok(deletedOrder.length === 0, "parentCustomer's 'Orders' should be empty");
    });

Breeze 文档描述了沙盒编辑的概念(http://www.getbreezenow.com/documentation/multiple-managers http://www.getbreezenow.com/documentation/multiple-managers)。我想将这个概念应用到模式对话框中。仅当用户单击“确定”按钮时,主窗口才会接受她的更改。当她单击取消按钮时,她的更改应该被删除。

这些是步骤:

  • 创建一个新的EntityManager(沙盒)
  • 使用应在对话框中显示或更改的实体填充沙箱 EntityManager。
  • 打开对话框并移交 Sandbox EntityManager。
  • 当用户单击“确定”按钮时,从沙箱 EntityManager 中导出所有已更改、添加和删除的实体,并将它们导入到主或父 EntityManager 中。
  • 当用户单击取消按钮时,不要理睬沙箱实体管理器,让垃圾收集器来完成工作。

在将已删除的实体传输回主或父 EntityManager 时,我遇到了此处描述的完全相同的问题。

var deletedEntities = sandboxEm.getEntities(breeze.EntityState.Deleted);
var deletedEntitiesExport = sandboxEm.exportEntities(deletedEntities, false);
mainEm.importEntities(deletedEntitiesExport).entities;

导入的实体被标记为已删除(EntityState 为已删除),但不会针对相关实体的导航属性删除它们。

tsdude 推荐的解决方法确实not为我工作:

var deletedEntities = sandboxEm.getEntities(breeze.EntityState.Deleted);
var deletedEntitiesExport = sandboxEm.exportEntities(deletedEntities, false);
var deleted = mainEm.importEntities(deletedEntitiesExport).entities;

// without effect :-(
deleted.forEach(function (e) {
    e.entityAspect.setDeleted();
});

我无需导入已删除的实体即可完成此操作。我迭代已删除的实体,并将主 EntityManager 中的对应实体显式标记为已删除:

sandboxEm.getEntities(breeze.EntityState.Deleted).forEach(function (deleted) {
    var key = deleted.entityAspect.getKey();
    var e = mainEm.getEntityByKey(key);
    e.entityAspect.setDeleted();
});

注:Breeze版本为1.5.2。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Breeze - 已删除项目导航属性错误 的相关文章

随机推荐

  • CGFloat 和 NSNumber 之间的转换,无需不必要地提升为 Double

    众所周知 CGFloat 在 CoreGraphics UIKit 等中普遍存在 可以是 32 位或 64 位浮点数 具体取决于 处理器架构 In C CGFloat它是一个类型别名 到float or double 在 Swift 中它被
  • 仅使用两个变量交换两个数字

    它如何执行交换 a a b b a b a b a 我不同意把它换成书 书中的选项包括 a和b的值的补集 否定和b 希望这些选项也不能满足它 正确的算法应该是 a a b b a b a a b
  • Android SQLite 数据库从查询中删除重复项

    我是 SQLite 新手 我使用此查询是为了从特定用户的列中提取所有行 Cursor c db query true TABLE COLUMN USER user null null null null null 这是表格的示例 group
  • 在启动设置而不是结束时提取文件

    我正在使用最新版本的 inno 它在安装过程中执行以下操作 执行依赖性检查以查看安装的内容 安装尚未安装的依赖项 net sql server directx 等 从 Files 部分安装应用程序和文件 wpReady 检查 SQL Ser
  • 来自 Transformer 的 BERT 句子嵌入

    我正在尝试从 BERT 模型中的隐藏状态获取句子向量 查看huggingface BertModel 说明here https huggingface co bert base multilingual cased text This 20
  • “git merge --squash”的正确用例是什么?

    有些人喜欢git merge squash由于以下原因 压缩到单个提交使您有机会清理混乱的 WIP 提交 并为您要合并的更改提供良好的理由 https coderwall com p qkrmjq git merge squash http
  • 改造中如何使用HashMap发布数据?

    您能解释一下如何使用以下方式发布数据吗hashmap in 改造2 这就是我发的帖子 FormUrlEncoded POST getProfile Call
  • SSL握手时是否检查服务器域名

    在 SSL 握手期间 是否在 SSL 握手期间检查服务器的域名 我的意思是 是否根据服务器运行的域检查了经过认证的服务器中的域名 示例 假设服务器证书具有域 mydomain com 如果服务器在域 someotherdomain com
  • 通过 C# 修改 Outlook OFT 文件

    我的情况是 我有大量 OFT Outlook 模板文件 大约 1000 个 它们都需要使用新的联系信息进行编辑和保存 更新 收件人 和 抄送 行 我过去曾使用过 Outlook C API 但从未使用过 oft 文件 是否可以读取 oft
  • 错误:无法识别的指令 [ORG]

    我试图编写一个引导加载程序以在 dos box 中使用 我写了下面的代码 BITS 16 tell the assembler that its a 16 bit code ORG 0x7C00 Origin tell the assemb
  • PostgreSQL 锁定机制中的错误或对该机制的误解

    我们遇到了 PostgreSQL 9 0 12 锁定机制的问题 这是我们重现该问题的最小代码 Scenario Transaction 1 Transaction 2 BEGIN BEGIN select trees for update
  • Scala Sparkcollect_list() 与 array()

    有什么区别collect list and array 在 Spark 中使用 scala 我看到到处都有使用情况 但我不清楚用例来确定差异 尽管两者array https spark apache org docs latest api
  • OSX 上的 Java 7 使用 jnlp/webstart 时出现文件名编码问题

    我遇到了这个问题 经过几天的搜索和解决方法尝试均未成功 我现在有一个由 jnlp webstart 分发的内部 java swing 程序 在 osx 和 windows 计算机上 除其他外 它还从 WebDav 下载一些文件 最近 在装有
  • 为什么不能在 f 字符串中使用“await”?

    为什么不能在 f 字符串中使用 await 有什么方法可以强制 f 字符串在协程函数的上下文中评估格式表达式吗 python3 Python 3 6 0 default Mar 4 2017 12 32 37 GCC 4 2 1 Compa
  • 如何减少 VS Code 中选项卡手柄的高度?

    在 的帮助下this https github com be5invis vscode custom css扩展 您可以更改 VS Code 的样式 我想将 filetabs 的高度减少到 20px 我正在使用这样的东西 editor gr
  • 在 CMake 中,CHECK_INCLUDE_FILE_CXX 如何工作?

    以下代码不打印任何内容 CHECK INCLUDE FILE CXX glog logging h GLOG INCLUDE IF GLOG INCLUDE MESSAGE YY ENDIF GLOG INCLUDE 但我设置了以下环境变量
  • 使用包含本机 DLL 的 nuget 包时发出警告

    我正在构建一个 ASP NET Core Web API 应用程序 它使用 NET Standard 2 0 库来包装一些 C C 本机库 本机库内置于特定于平台的 Win32 dll Linux so 和 MacOS dylib 等中 并
  • 闪烁 Tkinter 标签

    我是 python 的初学者程序员 最近开始使用 tkinter 尽管我遇到了一个无法解决的问题 基本上我有两个输入框 条目 1 消息 条目 2 否 闪光数 这只是我需要的一个例子 我所需要的只是一个用于弹出和闪烁标签的 for 循环ent
  • 使用 Unsafe.defineClass 在运行时定义多个类

    我正在为我的自定义编程语言开发 REPL 它是在编译器之上实现的 用于生成输入的字节码并将其转换为Class gt classes for ICompilable c compilables classes add compile comp
  • Breeze - 已删除项目导航属性错误

    根据breeze api 当调用setDeleted时 它将从所有相关实体中删除该实体 这是事实 但使用实体管理器的 importEntities 函数导入已删除项目时 该行为存在缺陷 已删除的实体将清空其导航属性 但具有包含已删除项目的导