0

我在我的 asp.net 应用程序中使用 Breeze 和 Durandal SPA 模板。

我需要向数据库中已经存在的 saveMap 添加一个实体。

让我们看这个简单的例子:页面显示发票和发票的行。用户添加新发票行并单击保存按钮。SaveChanges 控制器的操作仅由修改后的发票行触发。服务器端,重新计算总额,必须修改发票的总额。但是这个总数位于发票实体上,所以我们需要将发票的实体添加到 saveMap。

我在这里找到了一种向 saveMap 添加新实体的方法:Breeze BeforeSaveEntities: how to modify savemap

但是建议的解决方案用于向 saveMap(已添加状态)添加一个新实体,这将在 DB 上创建一个新记录。这不是我需要的。我需要向 saveMap 添加一个新实体,该实体(修改状态)将从数据库中获取数据。

我试过这样:

int invoiceId = 1234;
dc.Configuration.ProxyCreationEnabled = false; // don't forget this!
EFContextProvider<BreezeContext> cp = new EFContextProvider<BreezeContext>();
var acc = dc.Invoices.Where(x => x.Id == invoiceId).FirstOrDefault();
ei = cp.CreateEntityInfo(acc, Breeze.WebApi.EntityState.Modified);
invoices = new List<EntityInfo>();
saveMap.Add(typeof(Invoice), invoices);
invoices.Add(ei);

到目前为止,一切都很好。

然后我需要将total属性添加到OriginalValuesMap中(否则修改不会更新):

ei.OriginalValuesMap.Add("TotalExclVAT", invoice.TotalExclVAT);

**这不起作用:ei.OriginalValuesMap为空,因此我无法在其中添加新密钥。

我不知道这是否是正确的方法。希望我的解释足够清楚。

谢谢你的帮助。


更新

正如杰所建议的那样:

ei.ForceUpdate = true; 

OriginalValuesMap在这种情况下无需照顾。

4

1 回答 1

2

我还没有机会对此进行深入研究,但是您是否查看过 EntityInfo.ForceUpdate 属性。

当对现有实体进行服务器端修改时,此属性可用于强制对整个实体进行服务器端更新。可用于代替显式更新 EntityInfo.OriginalValuesMap。

到目前为止,我们只在发行说明中记录了这一点,因此可以理解它是如何被遗漏的。

于 2013-09-11T18:21:08.443 回答