我在我的 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
在这种情况下无需照顾。