breeze BeforeSaveEntity不保存计算值

时间:2013-12-08 21:23:33

标签: breeze

我需要在特定实体更新时在服务器端计算一些值。 如果我更新实体,则执行以下代码(C_CompletePrice得到设置),它甚至会反映在客户端上(clientside breeze可以很好地获取所有属性) 但是当我检查数据库时没有保存任何内容。因此,当清除浏览器缓存并再次检查实体时,会有旧值......

    private bool BeforeSaveTransaction(tblTransactions transaction, EntityInfo info)
    {
        transaction.C_CompletePrice = 11111111;
        return true;
        ...

  protected override bool BeforeSaveEntity(EntityInfo entityInfo)
    {
        var entity = entityInfo.Entity;
        if (entity is tblTransactions)
        {
            return BeforeSaveTransaction(entity as tblTransactions, entityInfo);
        }
        ...

我正在使用breeze 1.4.6

服务器上的

我正在使用Breeze.WebApi和Breeze.WebApi.EF

我正在使用的模型:http://pastebin.com/Dc03DrNe

更新

    protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap)
    {
        foreach (Type entityType in saveMap.Keys)
        {
            if (entityType.Name == "tblTransactions")
            {
                foreach (EntityInfo ei in saveMap[entityType])
                {
                    CalculateTransaction(ei);
                }
            }
        }
        return base.BeforeSaveEntities(saveMap);
    }

    private  void CalculateTransaction(EntityInfo entityInfo)
    {
        tblTransactions transaction = (tblTransactions) entityInfo.Entity;

        transaction.C_CompletePrice = 1234567;
        ...

使用BeforeSaveEntities会导致同样的奇怪行为:

  • 客户端上的实体获取更新:)

  • DB不:(

所以在我现在使用@dominictus解决方案(覆盖SaveAll)之前,我正在请求我使用的那些方法的目的 bool BeforeSaveEntity(...)和BeforeSaveEntities(saveMap))。我已经咨询过该文档,我已经看过bryan noyes辉煌的复数视频课程,但我的简单思维仍然没有得到它:)

2 个答案:

答案 0 :(得分:1)

您是否按照ContextProvider topic

中的说明更新了EntityInfo.OriginalValuesMap

答案 1 :(得分:0)

我做的有点不同。这是一个我更改对象时保存时间戳的示例。这是我的Context类中的一个方法。

    public override int SaveChanges()
    {
        foreach (
            var entry in
                this.ChangeTracker.Entries()
                    .Where((e => (e.State == (EntityState) Breeze.WebApi.EntityState.Added || e.State == (EntityState) Breeze.WebApi.EntityState.Modified))))
        {
            if (entry.Entity.GetType() == typeof(MyClass))
            {
                var entity = entry.Entity as MyClass;
                if (entity != null) entity.UpdatedDateTime = DateTime.Now;
            }
        }
        return base.SaveChanges();
     }

在您的情况下,您可以写下:entity.C_CompletePrice = 11111111;

对于方法BeforeSaveEntity,我更喜欢使用BeforeSaveEntities。查看breeze文档以获取示例。