2012-02-24 26 views
7

Tôi đã thiết lập Khung thực thể để cập nhật bảng. Bản cập nhật được chặn bởi một thay-of kích hoạt, trong đó kêu gọi RAISERROR:Làm thế nào để bắt được một SqlException được ném bởi RAISERROR được gọi là trong một bộ kích hoạt được thiết lập bởi Entity Framework 4?

CREATE TRIGGER mySchema.UpdateBusinessObjects 
ON mySchema.BusinessObjects 
INSTEAD OF UPDATE 
AS 
    RAISERROR(''test error from SQL'',16,1) 
    RETURN 

Trong lớp kho của tôi, tôi đang cố gắng để bắt SqlException tạo ra bởi các RAISERROR trong SQL:

public void SaveBusinessObject(BusinessObject b) { 
    try { 
     repo.Entry(b).State = EntityState.Modified; 
     repo.SaveChanges(); 
    } catch (SqlException ex) { 
     // handle exception here 
    } 
} 

Các vấn đề là C# không bắt được SqlException; nó được truyền cho người gọi như là một ngoại lệ chưa được giải quyết ("SqlException đã được unhandled bởi người dùng: kiểm tra lỗi từ SQL"). Gì?!

Dường như SaveChanges của EF() bằng cách nào đó đã vượt qua ngoại lệ trên khối try try của tôi. Tôi đã cố gắng chuyển đổi câu lệnh catch của tôi để bắt (Exception ex) trong trường hợp ngoại lệ EF bằng cách nào đó tổng quát hơn, nhưng tôi vẫn nhận được một SqlException chưa được giải quyết. Tôi thiếu một cái gì đó đơn giản ở đây? Vấn đề với phương thức SaveChanges() là gì?

+0

Hãy thử với một catch có sản phẩm nào chỉ để xem những gì sẽ xảy ra –

+0

Dường như trong tình huống này là 2 trường hợp ngoại lệ được hiển thị khi ở chế độ trong Visual Studio gỡ lỗi: người đầu tiên là một "System.Data.SqlClient.SqlException" đó là không bị bắt bởi * bất kỳ * "catch()" loại tuyên bố. Cái thứ hai là một "System.Data.Entity.Infrastructure.DbUpdateException" được bắt bởi .NET, và chứa cái cũ là InnerException. Tuy nhiên, chỉ có nguyên nhân thứ hai gây ra sự cố .NET - lỗi đầu tiên bị bỏ qua. Nó có thể được rằng trước đây là đến từ một quá trình bên ngoài, giống như máy chủ SQL? – rocketmonkeys

Trả lời

0

Cách duy nhất tôi biết có ngoại lệ tránh một lần thử bắt là có ngoại lệ trong một chuỗi khác. Mã EF có thể được thực thi trên một luồng khác không? Có lẽ bạn có thể cho phép ngoại lệ ném vào 1º cơ hội tại hộp thoại Exceptions.

1

Tôi đã thử gần như chính xác cùng một trình kích hoạt bạn có trên một bảng và cố lưu đối tượng (mới) tương ứng thông qua khung thực thể. Từ những gì tôi có thể thấy, ngoại lệ được ném ra là kiểu System.Data.UpdateException và không phải là SqlException. Ngoại lệ bên trong là SqlException và chứa thông báo tùy chỉnh mà bạn đã nêu trong trigger là 'test error from SQL'. Hy vọng điều này sẽ giúp

+0

Cảm ơn .. vấn đề là tôi không thể bắt được ngoại lệ ngay cả với loại ngoại lệ cơ bản nhất, vì vậy tôi không thể đào sâu và tìm ra loại đó là gì. Ý bạn là "từ những gì bạn có thể thấy"? – user941238

0

Tôi gặp sự cố chính xác này.

Tôi đã sử dụng trình thu nhỏ MVC để định cấu hình thời gian truy vấn. Tôi thấy rằng nếu tôi xóa nó khỏi dự án của tôi, thì các ngoại lệ đã bị bắt như tôi mong đợi.

0

Có 2 điều: -

  1. Nếu bạn muốn RAISERROR để ném một SqlException, bạn cần phải thiết lập mức độ nghiêm trọng của nó trên 10 lỗi với một mức độ 10 và dưới đây là thông tin, và do đó don' t ném ngoại lệ.

  2. Catch EntityException hoặc Đặt điểm ngắt trong khối catch chung của Ngoại lệ. Trong cửa sổ ngay lập tức, kiểm tra loại ngoại lệ: ex.GetType();

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