Breeze BeforeSaveEntityonly仅允许更新添加的实体

时间:2013-02-28 22:32:03

标签: breeze

不知道这是有意还是错误,但下面的代码使用BeforeSaveEntity只会修改新创建的记录的实体(EntityState =已添加),并且不能用于修改,这是正确的吗? / p>

    protected override bool BeforeSaveEntity(EntityInfo entityInfo)
    {
        var entity = entityInfo.Entity;
        if (entity is User)
        {
            var user = entity as User;
            user.ModifiedDate = DateTime.Now;
            user.ModifiedBy = 1;
        }
...

2 个答案:

答案 0 :(得分:9)

此问题的根源在于,在breeze服务器上,我们没有任何内置的更改跟踪机制来进行服务器上所做的更改。服务器实体可以是纯poco。 breeze客户端具有丰富的更改跟踪功能,可用于任何客户端更改,但是当您到达服务器时,您需要自己管理它。

问题出现是因为我们在服务器上执行了优化,因此我们只更新那些已更改的属性。即,以便只对更改的列进行任何SQL更新语句。显然,对于添加或删除或我们更新已在客户端上更新的列的情况,这不是问题。但是,如果更新服务器上未在客户端上更新的字段,那么breeze对此一无所知。

理论上,我们可以对进入服务器的每个实体进行快照,然后迭代实体上的每个字段,以确定在保存拦截期间是否进行了任何更改,但我们真的很讨厌性能影响,特别是因为这种情况很少发生。

因此,在此处另一个答案中提出的更新服务器端OriginalValuesMap的建议是正确的,并且将完全按照您的需要进行操作。

此外,从版本1.1.3开始,还可以设置一个额外的 EntityInfo.ForceUpdate 标志,该标志将告诉breeze更新指定实体中的每一列。这不如上面的建议那么高效,但它更简单,在任何一种情况下效果都是相同的。

希望这有帮助。

答案 1 :(得分:7)

我遇到了同样的问题,我解决了这个问题:

protected override bool BeforeSaveEntity(EntityInfo entityInfo)
{
  if(entityInfo.EntityState== EntityState.Modified)
  {
     var entity = entityInfo.Entity;
     entityInfo.OriginalValuesMap.Add("ModificationDate", entity.ModificationDate);
     entity.ModificationDate = DateTime.Now;
  }
}

我认为您可以轻松地将此应用于您的案例。