2011-12-20 19 views
5

Tôi nhận được một hệ thống .Data.SqlClient.SqlException: Máy chủ không thể tiếp tục giao dịch. Mô tả: 6c00000001 khi thực hiện truy vấn LINQ-To-SQL.Máy chủ không thể tiếp tục giao dịch. LINQ-To-SQL

Đây là cuộc gọi kho của tôi:

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(); 
} 

Đây là SQL tạo:

-- 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 

Như bạn có thể thấy tôi là tạo ra và xử lý các DataContext ngay sau khi truy vấn cơ sở dữ liệu, vì vậy không có cuộc gọi nào khác có thể được thực hiện từ phương thức gọi.

Tôi thấy rằng có hai truy vấn được phát hành cho cơ sở dữ liệu và dự đoán của tôi là khi phát hành truy vấn thứ hai tới cơ sở dữ liệu giao dịch, nhưng LINQ-To-SQL phải thông minh hơn.

Tôi đang sử dụng .NET 4.0 và SQL Server 2008 R2 (SP1) - 10.50.2789.0

Bất kỳ ý tưởng nào?

CẬP NHẬT Dec/21/2011

Dưới đây là một mảnh của ngoại lệ: Giao dịch tích cực trong phiên này đã được cam kết hoặc hủy bỏ bởi phiên khác

CẬP NHẬT Dec/30/2011

Một đồng nghiệp phát hiện ra rằng vấn đề này đã được báo cáo cho Microsoft và nó đã được xác nhận là lỗi nhưng nó sẽ không được sửa, và đề xuất của họ là chuyển sang Khung thực thể.

+0

Chỉ đọc, ý nghĩa của cam kết – Pleun

+0

Điều gì sẽ xảy ra nếu bạn thực thi mà không cần tải dữ liệu và đối tượng đính kèm đã được kích hoạt – Pleun

+0

@Pleun vui lòng đọc thông báo ngoại lệ. Nó nói rằng nó không thể tiếp tục giao dịch. Tôi vẫn nhận được ngoại lệ mà không cần theo dõi đối tượng và tải chậm. Khi tôi loại bỏ các tùy chọn tải dữ liệu thì nó hoạt động tốt, nhưng nó cũng làm việc với chúng. Đó là toàn bộ vấn đề để có được nhiều sự liên quan có liên quan nhất có thể trong một chuyến đi cơ sở dữ liệu duy nhất. – epignosisx

Trả lời

0

Một đồng nghiệp phát hiện ra rằng vấn đề này đã được báo cáo cho Microsoft và nó đã được xác nhận là lỗi nhưng nó sẽ không được sửa, và đề xuất của họ là chuyển sang Entity Framework.

-1

Một chút quá dài đối với nhận xét.

Bạn cần nhận ra rằng tải háo hức trong linq2sql không hoạt động trên nhiều cấp độ trong một cây. Vì vậy, tải b với a và c với b không tải a-b-c trong một lần.

http://www.lowendahl.net/showShout.aspx?id=190

này giải thích truy vấn thứ hai bổ sung của bạn.

Bây giờ, tại sao bạn có ngoại lệ mà tôi không biết.

+0

Tôi không gặp vấn đề với các truy vấn bổ sung được cấp cho cơ sở dữ liệu. Nếu không thể lấy tất cả dữ liệu trong một lần, tôi sẽ đồng ý với nó.Tuy nhiên, tôi không thấy bất cứ điều gì sai trong truy vấn của tôi là thất bại như thế. – epignosisx

+0

Nó có thể là một vấn đề thời gian chờ? Điều gì xảy ra nếu bạn thực thi sql thô trong máy chủ sql? – Pleun

+0

nó sẽ trả về ngay lập tức. Truy vấn mất ít hơn một giây để hoàn tất. – epignosisx

Các vấn đề liên quan