将实体添加到来自DB的Breeze saveMap(不是一个全新的实体)

时间:2013-09-11 17:55:16

标签: entity-framework breeze durandal

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

我需要将一个实体添加到已存在于DB中的saveMap中。

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

我找到了一种方法来继续向saveMap添加新实体:Breeze BeforeSaveEntities: how to modify savemap

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

我试过这样:

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

1 个答案:

答案 0 :(得分:2)

我还没有机会深入研究这个,但是你看过EntityInfo.ForceUpdate属性。

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

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