3

我在服务器端使用 WebApi 的胖客户端应用程序中使用 Breeze.Sharp。当我在 EntityManager 对象上多次调用 ExecuteQuery 时,我注意到了一个问题。

如果 ExecuteQuery 调用返回的任务没有按照创建它们的顺序完成,那么 EntityManager 将无法更改任何已修改实体的状态。修改后的实体将始终保持未更改状态,从而在 SaveChanges 调用中发送空白响应。

public Task<IEnumerable<SomeType>> GetSomeTypeAsync(string type)
    {
        EntityQuery<SomeType> query = new EntityQuery<SomeType>()
            .Expand("Nav1,Nav2").Where(s => s.Type = type);

        return entityManager.ExecuteQuery(query);
    }

上面的代码非常简单,但是如果我在循环中调用此方法,其中一些调用比其他调用慢,我会遇到所描述的问题。

查看源代码似乎 EntityManager 不是线程安全的。EntityManager 对象上有一个内部布尔属性 IsLoadingEntity,当它通过这些多个 ExecuteQuery 调用时,它保持设置为 True,即使所有任务都完成,这个属性也不会被设置回 false。这导致 SaveChanges 什么也不做。

这听起来很熟悉吗?我们有任何修复还是我做错了什么?

4

0 回答 0