在SMS中使用SQL时,它可以正常运行,当从Linq运行到SQL时,它会失败



我在 LINQ to SQL 上有一个非常神秘的问题,它在我的应用程序运行时表现出来。

当我在 SQL Management Studio Microsoft执行此查询时:

DELETE FROM [DEVICEQUEUE] WHERE DEVICE_ID = 74537638492227750 AND QUEUE_ID = '16d0b5c4-5ea1-4644-bde2-04bf84e5080b'

它将很好地处理所有受影响的记录。

但是当我从 C#DataContext.-databasename-.ExecuteCommand运行相同的查询时,我得到一个堆栈跟踪,告诉我存在外键冲突(事实上,有外键添加到 DEVICEQUEUE 表中)

The DELETE statement conflicted with the REFERENCE constraint "FK_DEVICEQUEUE_QUEUE". The conflict occurred in database "x", table "dbo.DEVICEQUEUE", column 'QUEUE_ID'.
The statement has been terminated. # System.Data.SqlClient.SqlException # Void OnError(System.Data.SqlClient.SqlException, Boolean) # at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
<the rest of the stacktrace>

我检查了所有数据,没问题(因此SQL Management Studio的相同命令100%有效),但是现在我对如何调试此问题一无所知。如何从 Linq 到 SQL 中提取更多信息以解决此问题?

打开SQL Server 事件探查器以查看实际执行的查询可能会有所帮助。我通常通过SQL Server ManagementStudio,Tools,SQL Server Profiler菜单项打开它。

在">连接到服务器"对话框之后,将显示">跟踪属性"对话框。

  • 选择模板TSQL_Duration,然后单击运行

执行 LINQ 查询并查看执行了哪个查询。它还将以毫秒为单位显示持续时间。

(可选)假设服务器上有大量数据库活动,您可以应用一些筛选。

"跟踪属性"对话框中,勾选">显示所有列",然后单击"列筛选器"。弹出的"编辑过滤器"对话框允许您指定过滤器。对">数据库名称"和"主机名"列进行过滤将派上用场。

最新更新