代码之家  ›  专栏  ›  技术社区  ›  Bronzato

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

  •  0
  • Bronzato  · 技术社区  · 11 年前

    我在我的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; // 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);
    

    到现在为止,一直都还不错。

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

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

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

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

    谢谢你的帮助。


    更新

    正如Jay所建议的:

    ei.ForceUpdate = true; 
    

    不需要照顾 OriginalValuesMap 在这种情况下。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Jay Traband    11 年前

    我还没有机会深入了解这一点,但您查看过EntityInfo.ForceUpdate属性吗。

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

    到目前为止,我们只在发行说明中记录了这一点,所以可以理解为什么会错过它。