我在我的asp.net应用程序中使用Breeze和Durandal SPA模板。
我需要向数据库中已经存在的saveMap添加一个实体。
让我们举一个简单的例子:页面显示发票和发票行。用户添加新发票的行,然后单击保存按钮。SaveChanges控制器的操作仅由修改后的发票行触发。服务器端,将重新计算总额,并且必须修改发票的总额。但是这个总数位于发票实体上,所以我们需要将发票的实体添加到saveMap中。
我找到了一种方法,可以在此处将新实体添加到saveMap中:
Breeze BeforeSaveEntities: how to modify savemap
但建议的解决方案用于向saveMap添加一个新的实体(已添加状态),这将在DB上创建一个新记录。这不是我需要的。我需要向saveMap添加一个新的实体,该实体(已修改状态)将从DB获取数据。
我这样试过:
int invoiceId = 1234;
dc.Configuration.ProxyCreationEnabled = false;
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);
到现在为止,一直都还不错。
然后我需要将总属性添加到OriginalValuesMap(否则修改将不会更新):
ei.OriginalValuesMap.Add("TotalExclVAT", invoice.TotalExclVAT);
**这不起作用:
ei.OriginalValuesMap
为null,因此我无法在里面添加新密钥。
我不知道这样做是否正确。希望我的解释足够清楚。
谢谢你的帮助。
更新
正如Jay所建议的:
ei.ForceUpdate = true;
不需要照顾
OriginalValuesMap
在这种情况下。