दो वर्ग होने:
public class Parent
{
public int Id { get; set; }
public int ChildId { get; set; }
}
public class Child { ... }
जब बताए ChildId
करने के लिए Parent
मैं पहले की जाँच करनी चाहिए अगर यह DB में मौजूद है या इंतजार डीबी एक अपवाद फेंकने के लिए के लिए?
उदाहरण के लिए (एंटिटी फ्रेमवर्क कोर का उपयोग करके):
ध्यान दें कि इस प्रकार के चेक आधिकारिक Microsoft डॉक्स पर भी सभी इंटरनेट पर हैं: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using- mvc / handle-concurrency-with-the-unit-the-Framework-in-a-asp-net-mvc-application # संशोधित-दर-विभाग-नियंत्रक लेकिन इसके लिए अतिरिक्त अपवाद हैंडलिंग हैSaveChanges
यह भी ध्यान दें, इस चेक का मुख्य उद्देश्य एपीआई के उपयोगकर्ता के लिए अनुकूल संदेश और ज्ञात एचटीटीपी स्थिति को वापस करना था और डेटाबेस आयनों को पूरी तरह से अनदेखा नहीं करना था। और एक ही जगह के अपवाद को फेंक दिया जाना चाहिए अंदर SaveChanges
या SaveChangesAsync
कॉल ... इसलिए जब आप कॉल करते हैं FindAsync
या कोई अपवाद नहीं होगा Any
। इसलिए यदि बच्चा मौजूद है, लेकिन इससे पहले हटा दिया गया था, SaveChangesAsync
तो संगामिति अपवाद को फेंक दिया जाएगा।
मैंने ऐसा इस तथ्य के कारण किया है कि foreign key violation
"आईडी के साथ बच्चे को प्रदर्शित करने के लिए प्रारूपण के लिए अपवाद बहुत कठिन होगा।
public async Task<ActionResult<Parent>> CreateParent(Parent parent)
{
// is this code redundant?
// NOTE: its probably better to use Any isntead of FindAsync because FindAsync selects *, and Any selects 1
var child = await _db.Children.FindAsync(parent.ChildId);
if (child == null)
return NotFound($"Child with id {parent.ChildId} could not be found.");
_db.Parents.Add(parent);
await _db.SaveChangesAsync();
return parent;
}
बनाम:
public async Task<ActionResult<Parent>> CreateParent(Parent parent)
{
_db.Parents.Add(parent);
await _db.SaveChangesAsync(); // handle exception somewhere globally when child with the specified id doesn't exist...
return parent;
}
Postgres में दूसरा उदाहरण 23503 foreign_key_violation
त्रुटि फेंक देगा : https://www.postgresql.org/docs/9.4/static/errcodes-appendix.html
ईआरएम की तरह ओआरएम में अपवादों को संभालने का नकारात्मक पक्ष यह है कि यह केवल एक विशिष्ट डेटाबेस बैकएंड के साथ काम करेगा। यदि आप कभी SQL सर्वर या कुछ और पर स्विच करना चाहते हैं तो यह अब काम नहीं करेगा क्योंकि त्रुटि कोड बदल जाएगा।
एंड-यूज़र के लिए अपवाद को ठीक से फ़ॉर्मेट नहीं करना कुछ ऐसी चीज़ों को उजागर कर सकता है जिन्हें आप नहीं चाहते हैं लेकिन डेवलपर्स देखना चाहते हैं।
सम्बंधित:
https://stackoverflow.com/questions/308905/should-there-be-a-transaction-for-read-queries
Child with id {parent.ChildId} could not be found.
। और "विदेशी कुंजी उल्लंघन" का प्रारूपण मुझे लगता है कि इस मामले में और भी बुरा है।