2010-01-18 34 views
6

Gần đây tôi đã nhận được báo cáo lỗi từ khách hàng và không có may mắn giải quyết nó. Tôi hy vọng ai đó có thể cho tôi cái nhìn sâu sắc về những gì có thể sai.Lỗi khi xóa bản ghi bằng cách sử dụng Linq2SQL

Lỗi này có vẻ đơn giản đủ:

Csla.DataPortalException: DataPortal.Delete thất bại (System.InvalidOperationException: Chuỗi chứa nhiều hơn một phần tử ở System.Linq.Enumerable.SingleOrDefault [TSource] (nguồn IEnumerable`1)

đây là phương pháp DataPortal_Delete của tôi, trong đó có các fileId (PK) như một tham số.

private void DataPortal_Delete(SingleCriteria<File, Guid> criteria) 
    { 
     using (var ctx = ContextManager<Ronin.Data.RoninDataContext> 
        .GetManager(Database.ApplicationConnection, false)) 
     { 
      var data = ctx.DataContext.Files 
        .Single(row => row.FileId == criteria.Value); 

      ctx.DataContext.FileSources.DeleteAllOnSubmit(data.FileSources); 

      ctx.DataContext.Files.DeleteOnSubmit(data); 

      ctx.DataContext.SubmitChanges(); 
     } 
    } 

điều đầu tiên tôi kiểm tra là để xem nếu có một kỷ lục với fileId cùng (mặc dù là prima ry key, điều này sẽ là không thể). Tất cả FileIds thực ra là duy nhất. Tôi đã khởi chạy ứng dụng kết nối với cơ sở dữ liệu máy khách và cố gắng xóa bản ghi và nó đã hoạt động mà không có bất kỳ vấn đề nào. Các anh chàng CNTT tại trang web của khách hàng sử dụng "Problem Step Recorder" để gửi cho tôi từng bước ảnh chụp màn hình của các hành động được thực hiện bởi người dùng. Không có gì ngoài bình thường, và khi anh ta sử dụng một cỗ máy khác, anh ta có thể xóa bản ghi mà không có bất kỳ lỗi nào. Rõ ràng điều này chỉ xảy ra khi ứng dụng được chạy trong Windows 7.

Điều đó nói rằng, bất kỳ ý tưởng nào về điều gì có thể gây ra điều này?

+0

Files.FileId là khóa chính trên bảng đó? –

+0

Bạn có chắc chắn rằng lỗi được tạo bởi đoạn mã này không? Lỗi này đang tham chiếu SingleOrDefault, nhưng chức năng đang sử dụng Single. – gfrizzle

+0

Nộp tài liệu có phải là Null không? nếu đây là những đối tượng khác nhau, bạn không phải sử dụng một bao gồm để có được chúng trước khi bạn có thể xóa chúng? – awright18

Trả lời

1

Giả sử các cuộc gọi đến đơn là nguồn gốc của vấn đề, thay vì:

ctx.DataContext.Files.Single(...) 

thay đổi mã để cho phép sự trở lại của nhiều hàng từ truy vấn đó và sau đó đăng nhập gì nó trở về khi nó trả hơn một hàng. Điều này sẽ hướng bạn đến vấn đề dữ liệu "trùng lặp" của bạn.

Một điều cần xem xét là SQL đang được tạo phía sau hậu trường. Không chắc chắn rằng sẽ giúp đỡ, nhưng nó không thể làm tổn thương. Tôi không biết mô hình dữ liệu của bạn, vì vậy tôi không thể hiểu được mã của bạn cũng như tôi muốn.

+0

Có thông báo ngoại lệ khá rõ ràng; Đơn thực thi thực tế là chỉ có một hàng sẽ được trả về. Hai hoặc nhiều hơn sẽ dẫn đến ngoại lệ. Tôi sẽ không thay đổi mã mặc dù; một câu lệnh sql đơn giản sẽ tìm thấy dupe: 'select fileid, count (*) từ nhóm Files bởi fileid có count (*)> 1' – Andy

0

Nếu nó chỉ xảy ra trong Windows 7 thì điều này có thể do hệ điều hành gây ra. Bạn đã thử nó trên Vista chưa? Môi trường của Vista tương tự như trên Windows 7. Bạn cũng có thể sử dụng Windows Virtual PC + XP Mode. Đây là một ứng dụng ảo hóa được thiết kế đặc biệt cho Windows 7 để cho phép người dùng chạy các ứng dụng như họ sử dụng trong Windows XP. Lưu ý: Chế độ XP yêu cầu bộ xử lý có khả năng ảo hóa.

0

Tôi có cùng ngoại lệ khi xóa một thực thể. Vấn đề hóa ra là một quan hệ khóa ngoại được xác định trong dbml -File. Vì vậy, đây là lý do cho trường hợp ngoại lệ trong trường hợp của tôi. Sau khi tôi gỡ bỏ nó đã làm việc để xóa bản ghi (và tôi không muốn xóa bỏ các bản ghi từ bảng khác, tôi chỉ cần tìm hiểu cách cấu hình linq-to-sql để chỉ thiết lập cột khóa ngoài null)

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