微风 BeforeSaveEntity 不保存计算值

breeze BeforeSaveEntity does not save calculated value

当特定实体更新时,我需要在服务器端计算一些值。
如果我更新实体,则执行以下代码(设置 C_CompletePrice),它甚至反映在客户端(客户端微风很好地恢复了所有属性)
但是当我检查数据库时,什么都没有保存。因此,当清除浏览器缓存并再次检查实体时,会有旧值...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    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);
        }
        ...

我正在使用微风 1.4.6

在服务器上我正在使用 Breeze.WebApi 和 Breeze.WebApi.EF

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

更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    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 会导致相同的奇怪行为:

  • 客户端上的实体得到更新 :)

  • 数据库不是 :(

所以在我现在使用@dominictus 解决方案(覆盖SaveAll)之前,我恳请询问我使用过的那些方法的目的(bool BeforeSaveEntity(...) 和 BeforeSaveEntities(saveMap))。我已经咨询过医生,也看过 bryan noyes 精彩的复数课程,但我的头脑仍然很简单 :)


您是否按照 ContextProvider 主题中的说明更新了 EntityInfo.OriginalValuesMap


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    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。检查微风文档以获取示例。