不知道这是故意还是错误,但下面的代码使用BeforeSaveEntity只会修改新创建的记录的实体(EntityState =已添加),并且不能用于修改,这是正确的吗?
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;
}
...
Run Code Online (Sandbox Code Playgroud)
这个问题的根源在于,在breeze服务器上,我们没有任何内置的更改跟踪机制来进行服务器上所做的更改.服务器实体可以是纯poco.breeze客户端具有丰富的更改跟踪功能,可用于任何客户端更改,但是当您到达服务器时,您需要自己管理它.
出现问题是因为我们在服务器上执行了优化,因此我们只更新那些已更改的属性.即,以便只对更改的列进行任何SQL更新语句.显然,这不是添加或删除的问题,也不是我们更新已在客户端上更新的列的情况.但是,如果更新服务器上未在客户端上更新的字段,那么breeze对此一无所知.
从理论上讲,我们可以对进入服务器的每个实体进行快照,然后迭代实体上的每个字段,以确定在保存拦截期间是否进行了任何更改,但我们真的很讨厌性能影响,特别是因为这种情况很少发生.
因此,在此处另一个答案中提出的更新服务器端OriginalValuesMap的建议是正确的,并且将完全按照您的需要进行操作.
此外,从版本1.1.3开始,还有一个额外的EntityInfo.ForceUpdate标志,您可以设置该标志将告诉breeze更新指定实体中的每个列.这并不像上面的建议是高性能的,但是它比较简单,而且效果会在两种情况下是相同的.
希望这可以帮助.
我遇到了同样的问题,我解决了这个问题:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为您可以轻松地将此应用于您的案例.
归档时间: |
|
查看次数: |
1247 次 |
最近记录: |