使用 breeze.js 我只想发送 non-cached 实体的更新属性

Using breeze.js I only want to send updated properties for a non-cached entity

我有一个场景,我知道一个实体的主键(从不相关的来源检索),我只想更新 1 属性(数据库列)。我还没有从数据库中检索到实体。如果可能的话,我希望不必进行这次额外的往返。

我使用 manager.createEntity 创建实体。 我更新了其中一个属性。 然后将entityAspect设置为setModified(); 保存更改时,所有未更新的属性都设置为其默认值,并且生成的 SQL UPDATE 语句尝试更新所有映射的列。

有没有办法告诉 breeze 只为特定的 properties/columns 生成 SQL?

谢谢

如您所见,originalValuesMap 的属性指导 Breeze 服务器的 ContextProvider 准备保存请求。这记录在 ContextProvider topic.

在您的示例中,您在更改 属性 后调用 setModified。所做的只是改变 EntityState;它不会在客户端实体的 entityAspect.originalValuesMap 中创建条目...因此发送到服务器的 originalValuesMap 是空的。

I'm a little surprised that the EFContextProvider.SaveChanges prepared an EF update of the entire entity. I would have guessed that it simply ignored the entity all together. I'm making a mental note to investigate that myself. Not saying the behavior is "right" or "wrong".

您不必操纵 originalValuesMap 来实现您的目标。只是改变顺序。试试这个:

var foo = manager.createEntity('Foo', {
        id = targetId
    }, breeze.EntityState.Unchanged);  // create as if freshly queried

foo.bar = 'new value';  // also sets 'originalValues' and changes the EntityState

manager.saveChanges(); // etc.

让我们知道这是否有效。