9

これが意図されたものなのかバグなのかはわかりませんが、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;
        }
...
4

2 に答える 2

9

この問題の根本は、breezeサーバーには、サーバーで行われた変更に対する変更追跡メカニズムが組み込まれていないことです。サーバーエンティティは純粋なpocoにすることができます。そよ風のクライアントには、クライアント側の変更に対する豊富な変更追跡機能がありますが、サーバーに到達したら、これを自分で管理する必要があります。

この問題は、変更されたプロパティのみを更新するようにサーバーで実行する最適化が原因で発生します。つまり、SQL更新ステートメントは変更された列に対してのみ行われるようにします。明らかに、これは追加や削除、またはクライアントですでに更新されている列を更新する場合の問題ではありません。ただし、クライアントで更新されていないサーバー上のフィールドを更新した場合、breezeはそれについて何も知りません。

理論的には、サーバーに入る各エンティティのスナップショットを作成し、エンティティのすべてのフィールドを反復処理して、保存の傍受中に変更が加えられたかどうかを判断できますが、特にこのケースはめったに発生しないため、パフォーマンスへの影響は非常に嫌いです。

したがって、サーバー側のOriginalValuesMapを更新するためにここで行われた別の回答の提案は正しく、必要なことを正確に実行します。

さらに、バージョン1.1.3の時点で、指定されたエンティティのすべての列を更新するようにbreezeに指示する設定可能な追加の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 に答える