从BeforeSaveEntity返回false时,客户端会发生什么

时间:2013-03-14 16:35:39

标签: breeze

我正在寻找关于在从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();
    });
});

我发现这两个断言是真的,所以我认为这可能是一个错误。

为了进行测试我创建了一个自定义提供者:

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,因为类别实体被标记为已添加,在我看来我的经理不一致。

这是一个错误吗?我做错了什么?我的期望错了吗?

THX。

2 个答案:

答案 0 :(得分:1)

好的,从v 1.2.5(刚发布)开始,这应该是固定的。请回复确认是否可能,以及错误报告的thx。 :)

答案 1 :(得分:0)

嗯......这是一个有趣的问题。

EntityManager.hasChanges返回true的原因是你没有保存“添加的”Category对象,因此breeze不会在其上调用 EntityAspect.acceptChanges ,因为它实际上仍然是处于“增加的”但不可保存的状态

我认为这实际上是正确的行为,因为如果我们要在此实体上自动调用acceptChanges,您将永远不会在客户端上知道它尚未保存。您当然可以直接在promise回调中调用acceptChanges。

这有意义吗?