这是故事。我有一个通用的保存Web服务调用,它使用Entity Framework来保存任何实体对象。这样做的原因之一是,有一个非常紧凑的时间表,其中两个,我们正在谈论旧版本的Windows Mobile,因此几乎没有更好,更现代的方式来支持这一点。这是一个EntityObjects数组,它被传递到Web服务,然后:
Using TESTEntity As New TESTEntities(EntityConnectionString)
For Each change As Object In Changes
Dim item As EntityObject = DirectCast(change, EntityObject)
Dim NewState As EntityState
If (item.EntityKey Is Nothing) Then
NewState = EntityState.Added
Else
NewState = EntityState.Modified
End If
TESTEntity.AttachTo(change.GetType().Name, item)
TESTEntity.ObjectStateManager.ChangeObjectState(item, NewState)
Next
TESTEntity.SaveChanges()
End Using
此功能暂时运行良好。它在开发中对我们来说仍然可以正常工作,但它在客户端失败了。它到达SaveChanges然后挂起,直到抛出SQLTimeoutException
。
首先,我试过没有运气就调高CommandTimeout值。
其次,这个网络服务在整个地方被多次调用,但似乎只在一个特定的地方失败,而且只在客户端网站上失败但不在这里。我们没有轻松访问客户端站点或数据库,但我们已经确认数据库模式匹配,我们相当确定他们的移动软件是最新版本(我们今晚确认)。
第三,我们在客户端的SQL Server上运行SQL分析器,看到正在进行的唯一请求是Audit Login
而没有运行任何其他查询。这个SaveChanges
只进行了少量的插入和更新,所以它不应该在一开始就超时。
如果有一个坏的实体对象或者关于架构的东西不匹配,我会期望一个不同的异常,或者至少SQL Profiler显示除了审计登录之外的其他东西......我在失去了发生了什么,有什么想法吗?