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();
    });
});

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

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

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(刚刚发布)开始,这应该是固定的。如果可能,请回帖确认,并感谢错误报告。:)

于 2013-03-19T18:48:52.923 回答
0

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

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

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

这有意义吗?

于 2013-03-14T18:57:10.230 回答