我在服务器端使用WebApi的胖客户端应用程序中使用Breeze.Sharp。当我在EntityManager对象上多次调用ExecuteQuery时,我注意到了一个问题。
如果ExecuteQuery调用返回的任务没有按照创建它们的顺序完成,那么EntityManager将无法更改任何已修改实体的状态。修改后的实体将始终保持Unchanged状态,从而在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什么都不做。
这听起来对任何人都很熟悉吗?我们有任何修正或者我做错了吗?