9

不知道这是有意的还是错误的,但是下面使用 BeforeSaveEntity 的以下代码只会修改新创建记录的实体(EntityState = added),并且对修改无效,这是正确的吗?

    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;
        }
...
4

2 回答 2

9

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

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

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

因此,在另一个答案中提出的更新服务器端 OriginalValuesMap 的建议是正确的,并且会完全满足您的需要。

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

希望这可以帮助。

于 2013-03-03T17:50:25.620 回答
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;
  }
}

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

于 2013-02-28T23:00:47.757 回答