不知道这是有意还是错误,但下面的代码使用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;
}
...
答案 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;
}
}
我认为您可以轻松地将此应用于您的案例。