2008-10-13 27 views
6

tôi đã có một số LINQ to SQL mà đôi khi ném mộtLàm thế nào bạn có thể thấy sql đang gây ra lỗi trên SubmitChanges trong LINQ to SQL?

"Không thể chèn trùng lặp hàng quan trọng trong đối tượng 'dbo.Table' với chỉ số duy nhất 'IX_Indexname'.The tuyên bố đã bị chấm dứt."

Có cách nào tôi có thể bật ghi nhật ký hoặc ít nhất là gỡ lỗi vào datacontext để xem sql đang được thực thi tại thời điểm lỗi được nêu lên không?

Cập nhật: Tôi có nên nói tôi biết về phương pháp GetChangeSet(), tôi đã tự hỏi nếu có một tài sản trên DataContext cho thấy SQL cuối cùng đã được thực hiện, hoặc một tài sản trên ngoại trừ sql cho thấy SQL .

Điều kỳ lạ về lỗi này là trong bộ thay đổi, chỉ có một bản cập nhật & trường duy nhất thay đổi là trường ngày giờ không nằm trong chỉ mục gây ra lỗi.

Trả lời

11

Một cách đơn giản để làm điều này là sử dụng DataContext.Log tài sản:

using (MyDataContext ctx = new MyDataContext()) 
{ 
    StringWriter sw = new StringWriter(); 
    ctx.Log = sw; 

    // execute some LINQ to SQL operations... 

    string sql = sw.ToString(); 
    // put a breakpoint here, log it to a file, etc... 
} 
+5

Sử dụng trình lược tả SQL sẽ là giải pháp thích hợp hơn vì bạn sẽ không phải thay đổi mã của mình. –

2

Khi chạy vào các vấn đề loại này, tôi đã sử dụng lược tả SQL. Về cơ bản bật profiler, đặt một điểm break vào lưu/cập nhật, xóa profiler và sau đó chạy chỉ là tuyên bố đó. Từ đó tôi có tất cả các câu lệnh SQL đã được thực hiện và tôi có thể thấy những gì đã được tạo ra. [Tôi hầu như đã làm điều này thông qua DataServices để .SaveChanges() là một vị trí rất thuận tiện để đặt điểm ngắt]

1

Bạn có thể sử dụng trình lược tả SQL để xem SQL khi nó nhấn máy chủ SQL.

Nếu bạn muốn xem những gì thực sự là ở sự thay đổi đặt bạn cần phải sử dụng:

context.GetChangedSet(); 

MSDN - http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.getchangeset.aspx

Sau đó bạn có thể xem từng câu lệnh SQL trước khi nó được gửi đến máy chủ.

Điểm cuối cùng của cuộc gọi là sử dụng khả năng gỡ lỗi của VS 2008 thông qua khuôn khổ .NET.

2

Viết một bài kiểm tra để cô lập các mảnh hoặc từng phần mã gây ra tất cả những rắc rối. Đặt DataContext.Log = Console.Out. Chạy thử nghiệm với một testrunner (NUnit, MSTest, vv). Những người thử nghiệm thường hiển thị mọi thứ được in trên Console.Out cùng với kết quả kiểm tra.

1

sử dụng SQL Profiler. Đó là bạn và tàu của bạn với SQL. bạn có thể xem bất kỳ câu lệnh SQL nào đang được thực hiện, với toàn quyền kiểm soát lọc.

0

Tôi phải đồng ý với Bradley Grainger bằng cách sử dụng thuộc tính DataContext.Log là cách tốt nhất để xem sql được thực hiện.

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