मेरे पास एक टेबल अपडेट करने के लिए सेट एंटिटी फ्रेमवर्क है। अद्यतन के द्वारा रोका जाता है एक के बजाय ट्रिगर है, जो RAISERROR कॉल:मैं एंटीटी फ्रेमवर्क 4 द्वारा सेट किए गए ट्रिगर में बुलाए गए RAISERROR द्वारा फेंक दिया गया एसक्यूएलएक्सप्शन कैसे पकड़ूं?
CREATE TRIGGER mySchema.UpdateBusinessObjects
ON mySchema.BusinessObjects
INSTEAD OF UPDATE
AS
RAISERROR(''test error from SQL'',16,1)
RETURN
मेरी भंडार वर्ग में, मैं SqlException एसक्यूएल में RAISERROR द्वारा उत्पन्न पकड़ने का प्रयास कर रहा हूँ:
public void SaveBusinessObject(BusinessObject b) {
try {
repo.Entry(b).State = EntityState.Modified;
repo.SaveChanges();
} catch (SqlException ex) {
// handle exception here
}
}
समस्या यह है कि सी # एसक्लएक्सप्शन को पकड़ नहीं रहा है; यह कॉलर को एक अनचाहे अपवाद के रूप में पारित किया जाता है ("एसक्यूएलएक्सप्शन उपयोगकर्ता द्वारा अनचाहे किया गया था: एसक्यूएल से परीक्षण त्रुटि")। क्या?!
ऐसा लगता है कि ईएफ की सेव चेंज() किसी भी तरह से मेरे प्रयास पकड़ ब्लॉक पर अपवाद पारित कर रहा है। यदि ईएफ अपवाद किसी भी तरह से सामान्य है, तो मुझे पकड़ने के लिए अपने कैच स्टेटमेंट को स्विच करने की कोशिश की गई है (अपवाद पूर्व), लेकिन मुझे अभी भी एक अनचाहे SqlException मिलता है। क्या मैं यहाँ कुछ आसान याद कर रहा हूँ? SaveChanges() विधि में क्या समस्या है?
सिर्फ देखने के लिए जब दृश्य स्टूडियो में मोड को दूर करने में क्या होता है –
यह इस स्थिति में लगता है कि 2 अपवाद दिखाए जाते हैं एक खाली पकड़ के साथ प्रयास करें: पहली बार एक "System.Data.SqlClient.SqlException" है * किसी भी * "पकड़()" प्रकार कथन द्वारा पकड़ा नहीं। दूसरा एक "System.Data.Entity.Infrastructure.DbUpdateException" है जिसे .NET द्वारा पकड़ा गया है, और इसमें पूर्वरक्षा के रूप में पूर्व शामिल है। हालांकि, केवल उत्तरार्द्ध .NET को क्रैश करने का कारण बनता है - पहले को अनदेखा किया जाता है। क्या यह हो सकता है कि पूर्व बाहरी प्रक्रिया से आ रहा है, जैसे SQL सर्वर? – rocketmonkeys