sql-server - 服务器无法恢复事务。 Linq 到 SQL

标签 sql-server linq-to-sql

我收到System.Data.SqlClient.SqlException:服务器无法恢复事务。描述:6c00000001 执行 Linq-To-SQL 查询时。

这是我的存储库调用:

using (var ctx = new EntitiesDataContext())
{
    ctx.ObjectTrackingEnabled = false;
    ctx.DeferredLoadingEnabled = false;

    var loadOptions = new DataLoadOptions();
    loadOptions.LoadWith<Company2QualifierLicense>(n => n.QualifierLicense);
    loadOptions.LoadWith<Company2QualifierLicense>(n => n.Company);
    loadOptions.LoadWith<QualifierLicense>(n => n.QualifierLicenseHoldStatus);
    loadOptions.LoadWith<QualifierLicense>(n => n.LicenseTrade);
    loadOptions.LoadWith<Company>(n => n.CompanyHoldStatus);
    ctx.LoadOptions = loadOptions;

    return ctx.Company2QualifierLicenses.Where(p => p.QualifierLicense.QualifierLicenseNumber == qualifierLicense).ToList();
}

这是生成的 SQL:

-- Region Parameters
DECLARE @p0 VarChar(1000) = '11223344'
-- EndRegion
SELECT [t0].[CompanyID], [t0].[QualifierLicenseID], [t0].[InitiatedDate], [t0].[IsActive], [t0].[RowVersion], [t0].[LastUpdated], [t1].[QualifierLicenseID] AS [QualifierLicenseID2], [t1].[QualifierLicenseNumber], [t1].[LicenseTradeID], [t1].[LicenseExpirationDate], [t1].[FirstName], [t1].[LastName], [t1].[MailingAddress1], [t1].[MailingAddress2], [t1].[City], [t1].[StateAbbr], [t1].[ZIP], [t1].[Email], [t1].[Phone], [t1].[RowVersion] AS [RowVersion2], [t1].[LastUpdated] AS [LastUpdated2], [t3].[test], [t3].[LicenseTradeID] AS [LicenseTradeID2], [t3].[LicenseCode], [t3].[LicenseDescription], [t5].[QualifierLicenseHoldStatusID], [t5].[HoldReasonID], [t5].[QualifierLicenseID] AS [QualifierLicenseID3], [t5].[RowVersion] AS [RowVersion3], [t5].[LastUpdated] AS [LastUpdated3], (
    SELECT COUNT(*)
    FROM [frontdesk].[QualifierLicenseHoldStatus] AS [t6]
    WHERE [t6].[QualifierLicenseID] = [t1].[QualifierLicenseID]
    ) AS [value], [t4].[CompanyID] AS [CompanyID2], [t4].[EIN], [t4].[CompanyName], [t4].[MailingAddress1] AS [MailingAddress12], [t4].[MailingAddress2] AS [MailingAddress22], [t4].[City] AS [City2], [t4].[StateAbbr] AS [StateAbbr2], [t4].[ZIP] AS [ZIP2], [t4].[Email] AS [Email2], [t4].[Phone] AS [Phone2], [t4].[RowVersion] AS [RowVersion4], [t4].[LastUpdated] AS [LastUpdated4]
FROM [frontdesk].[Company2QualifierLicense] AS [t0]
INNER JOIN ([frontdesk].[QualifierLicense] AS [t1]
    LEFT OUTER JOIN (
        SELECT 1 AS [test], [t2].[LicenseTradeID], [t2].[LicenseCode], [t2].[LicenseDescription]
        FROM [frontdesk].[LicenseTrade] AS [t2]
        ) AS [t3] ON [t3].[LicenseTradeID] = [t1].[LicenseTradeID]) ON [t1].[QualifierLicenseID] = [t0].[QualifierLicenseID]
INNER JOIN [frontdesk].[Company] AS [t4] ON [t4].[CompanyID] = [t0].[CompanyID]
LEFT OUTER JOIN [frontdesk].[QualifierLicenseHoldStatus] AS [t5] ON [t5].[QualifierLicenseID] = [t1].[QualifierLicenseID]
WHERE [t1].[QualifierLicenseNumber] = @p0
ORDER BY [t0].[CompanyID], [t0].[QualifierLicenseID], [t1].[QualifierLicenseID], [t3].[LicenseTradeID], [t5].[QualifierLicenseHoldStatusID]
GO

-- Region Parameters
DECLARE @x1 Int = 241
-- EndRegion
SELECT [t0].[CompanyHoldStatusID], [t0].[CompanyID], [t0].[HoldReasonID], [t0].[RowVersion], [t0].[LastUpdated]
FROM [frontdesk].[CompanyHoldStatus] AS [t0]
WHERE [t0].[CompanyID] = @x1

正如您所看到的,我在数据库查询后立即创建和处置 DataContext,因此无法从调用方法进行进一步的调用。

我看到向数据库发出了两个查询,我的猜测是,当向数据库发出第二个查询时,事务已提交,但 Linq-To-SQL 应该比这更聪明。

我使用的是 .NET 4.0 和 SQL Server 2008 R2 (SP1) - 10.50.2789.0

有什么想法吗?

2011 年 12 月 21 日更新

这是另一个异常: 此 session 中事件的事务已被另一个 session 提交或中止

2011 年 12 月 30 日更新

一位同事发现此问题已报告给 Microsoft,并已确认为错误,但不会修复,他们的建议是迁移到 Entity Framework 。

最佳答案

一位同事发现此问题已报告给 Microsoft,并已确认为错误,但不会修复,他们的建议是迁移到 Entity Framework 。

关于sql-server - 服务器无法恢复事务。 Linq 到 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8580412/

相关文章:

c# - LINQ WhereClause 的问题

asp.net-mvc - 查找相同类型的两个实体之间的差异

java - 如何使用 java 代码将 SQL Server bigint 转换为时间戳

mysql - SQL引用Select语句中的大方程

sql-server - 使用 <sql :SqlScript> element 通过 Wix 运行 SQL 脚本文件

linq 到 sql 连接 - ListBox 的名字和姓氏

sql-server - 如何使用 PARSE 和 .net 时间戳字符串作为 SQL 中的时间?

java - Sql Server 忽略 varchar 列上的索引并在从 Java 查询时进行表扫描

linq-to-sql - 动态存储过程名称linq to sql

web-services - 使用 join 在 linq 中检索 10 条记录