2

私の質問は:

Breeze.js で、このエンティティを保存する前にサーバー上のエンティティのプロパティ値を変更/設定することは可能ですか?

たとえば、Productというエンティティがあり、このエンティティにPriceというプロパティがあると仮定すると、サーバーでエンティティを保存する前に、Price値に定数を掛けます。

herehereを見て、次の方法を使用してみました: BeforeSaveEntity(entityInfo)BeforeSaveEntities(saveMap)SaveChangesCore(saveMap)

ソース コードでは、BeforeSaveEntity(entityInfo)BeforeSaveEntities(saveMap)はエンティティの検証にのみ使用されることを理解しました。それは私が探しているものではありません。

ここSaveChangesCore(saveMap)に記載されているソースコード付きのメソッドでは、ここがエンティティのプロパティ値を変更するところだと思いました。

ということで、以下を試してみましたがだめでした。データベースで値が更新されませんでした

protected override List<KeyMapping> SaveChangesCore(Dictionary<Type, List<EntityInfo>> saveMap)
        {
            foreach (var entity in saveMap[typeof(Product)])
            {
                var product = (Product)entity.Entity;

                product.Price =  product.Price * 10; // changing the value of the property    

            }

            return base.SaveChangesCore(saveMap);    
        }

前もって感謝します、

ベルナルド・パチェコ

4

2 に答える 2

3

dbcontext クラスで実行できます。SaveChanges メソッドをオーバーライドして、次のようにすることができます。

public override int SaveChanges() {
    foreach ( var entry in this.ChangeTracker.Entries()
            .Where( e => e.State ==EntityState.Added ) ){
        var entity=entry.Entity as Product;
        if(entity!=null){
            entity.Price =  entity.Price * 10;
        }
    }
    return base.SaveChanges();
}

エンティティ フレームワークを使用していると仮定しています。

この投稿もあなたの問題に関するものだと思います:

Breeze BeforeSaveEntityonly は、追加されたエンティティの更新のみを許可します

于 2013-03-27T15:37:24.067 に答える
2

まさにこれを行う同様のテストがあるため、何が起こっているのかはわかりませんが、いくつかの提案があります. 最初の変更

foreach (var entity in saveMap[typeof(Product)]) {
   ... 
}

List<EntityInfo> entities;
if (saveMap.TryGetValue(typeof(Product), out entities)) {
   foreach (var entity in entities) { 
      ...
   }
}

これは、saveMap が .NET Dictionary であり、キーが見つからない場合にインデクサー ( saveMap[typeof(Product)]) を使用すると KeyNotFoundException がスローされるためです。また、saveMap に特定の entityType が含まれていない場合も多くあります。

また、これはおそらくタイプミスですが、オーバーライドされたメソッドからの戻り値の型は、List< EntityInfo> ではなく、Dictionary< Type, List< EntityInfo>> である必要があります。

また、コードにステップインして、期待どおりに実行されていることを確認します。コードが例外をスローし、UI に伝播する前に食べられている可能性があります。

于 2013-03-27T19:10:52.000 に答える