1

BeforeSaveEntity(EntityInfo entityInfo) から false を返すときにクライアント側で何を期待するかについてのドキュメントを探していますが、何も見つからなかったので、自分で実験することにしました。

Doccode プロジェクトでテストを行いました。

test("create customer returning false from contextprovider", 1, function () {

    var em = newEm();
    var category = em.createEntity('Category', { CategoryName: 'Julian Category' });

    stop();

    em.saveChanges().then(function (saveResult) {
        //ok(category.entityAspect.entityState.isAdded(), "Added state because contextprovider return false");
        ok(em.hasChanges() === false,"No changes pending");
    })
    .fail(function (error) {
        debugger;
    })
    .fin(function () {
        start();
    });
});

そして、2 つの主張が正しいことがわかったので、バグである可能性があると思います。

テストを行うために、カスタム プロバイダーを作成しました。

public class CustomEFContextProvider : EFContextProvider<NorthwindContext>
{
    public CustomEFContextProvider() : base()
    {

    }

    protected override bool BeforeSaveEntity(EntityInfo entityInfo)
    {
        if(entityInfo.Entity.GetType() == typeof( Category)){
            return false;
        }

        return true;
    }
} 

それを使用するように NorthwindController を変更しました。

readonly CustomEFContextProvider _contextProvider =
    new CustomEFContextProvider();

カテゴリが保存されたときに false を返しているため、カテゴリがデータベースに挿入されず、saveResult.entities 配列に返されません。keyMappings も空です。これはすべて私が期待したものです。私が予想していなかったのは、カテゴリエンティティが追加済みとしてマークされているため、entitymanager.hasChanges 関数が false を返すことです。私の意見では、マネージャーに一貫性がありません。

バグですか?私は何か間違ったことをしていますか?私の期待は間違っていましたか?

どうも。

4

2 に答える 2

1

v 1.2.5 (リリースされたばかり) の時点で、これは修正されるはずです。可能であれば確認のために返信してください。また、バグ レポートについては thx を送信してください。:)

于 2013-03-19T18:48:52.923 に答える
0

うーん...それは興味深い質問です。

EntityManager.hasChanges が true を返す理由は、「追加された」Category オブジェクトが保存されていないためです。したがって、実際にはまだ「追加された」が保存可能な状態ではないため、breeze はそれに対して EntityAspect.acceptChangesを呼び出しません。

これは実際には正しい動作だと思います。なぜなら、このエンティティに対して acceptChanges を自動的に呼び出すと、エンティティが保存されていないことをクライアントで認識できないからです。もちろん、promise コールバック内で直接 acceptChanges を呼び出すことができます。

これは理にかなっていますか?

于 2013-03-14T18:57:10.230 に答える