我有EntityA,它具有EntityB的导航属性。在前端,可以创建新的EntityA并将其附加到EntityB。如果我现在尝试保存新创建的EntityA,Breeze还希望保存对EntityB的更改(包含新创建的EntityA的新ID)。是否有可能避免使用EntityB,因为在这个特定的用例中,应该可以将新实体附加到EntityB,但这些实体不应该保存回来(也不会报告为挂起的更改)?
我看到使用两个EntityManagers的可能性,但这意味着我不能再在两种类型之间拥有导航属性。
答案 0 :(得分:2)
Pascal提出了一个重要问题:是实体A和实体B一对一相关?更重要的是,它们是一对一的,A取决于B (即A是B的孩子)?
这种典型的关系是"扩展"实体。考虑"订单"和" OrderExtension"。 " OrderExtension"是一个螺栓固定类型,带有可选字段,"扩展"核心订单数据。订单可以有零个或一个" OrderExtension"记录。
Order
是此示例中的父级;它不应该有OrderExtension
的FK引用。 OrderExtension
是孩子,它应该有一个必需的OrderID
FK字段。父Order
可以在没有孩子的情况下存在,但子OrderExtension
不能与父母一起存在。
至少我认为应该是这样。我经常看到人们转过身来。它们为Order
提供OrderExtensionID
FK字段,该字段是可选的。 OrderExtension
没有Order
的后退。
这种设计的弱点在于它允许您创建多个不属于任何事物的孤立OrderExtension
实体......而且您很少知道它们在那里。
我打赌你的情况。我认为实体B与OrderExtension
类似,实体A类似于Order
。当您创建OrderExtension
(B)并将其与Order
(A)相关联时,Breeze会尝试通过更新Order.OrderExtensionID
属性来维护您的关系。这使Order
(A)处于修改状态。
在你弄清楚之前不要继续。虽然Jeremy是正确的,你可以通过樱桃选择挂起的更改来保存一个实体 - 你可以在不保存A的情况下保存B,你可能会破坏数据的完整性!
从建模角度来看您已使实体A依赖于实体B 。如果您在保存B的同时没有保存A,则使用该数据库的人无法知道这两者是否相关。
下次你查询其中任何一个时,你和Breeze都不会知道它们是相关的。您将无法在A和B之间导航。我非常确定这不是您的想法。
答案 1 :(得分:0)
您可以将包含要保存的实体的数组传递给saveChanges方法,以限制保存哪些实体。
来自breeze docs:
saveChanges([entities] [saveOptions] [callback] [errorCallback])async
保存指定实体列表或所有已更改实体 在这个EntityManager中。如果没有任何变化 指定的实体然后将没有服务器端调用但是a 有效'空'仍将返回saveResult。
参数:
[entities]实体数组可选要保存的实体列表。 无论是否更改,该列表中的每个实体都将被发送到服务器 或者保持不变,只要它附加到此EntityManager。如果这 参数被省略,null或为空(通常情况下),每个实体 将保存此EntityManager中的挂起更改。