দুটি শ্রেণি রয়েছে:
public class Parent
{
public int Id { get; set; }
public int ChildId { get; set; }
}
public class Child { ... }
যখন দায়িত্ব অর্পণ করা ChildId
হয় তখন Parent
আমি কি প্রথমে এটি ডিবিতে উপস্থিত কিনা তা পরীক্ষা করা উচিত বা ডিবি কোনও ব্যতিক্রম নিক্ষেপের জন্য অপেক্ষা করা উচিত?
উদাহরণস্বরূপ (সত্তা ফ্রেমওয়ার্ক কোর ব্যবহার করে):
উল্লেখ্য চেক এই ধরনের হয় সর্বাঙ্গে দ্য ইন্টারনেট এমনকি সরকারী Microsoft এর ডক্সে: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using- এমভিসি / হ্যান্ডলিং-কনকুরেন্সি-সাথে-সত্তা-কাঠামো-সাথে-একটি-এস্প-নেট-এমভিসি-অ্যাপ্লিকেশন # বিভাগ-বিভাগ-নিয়ামককে পরিবর্তন করুন তবে এতে অতিরিক্ত ব্যতিক্রম হ্যান্ডলিং রয়েছেSaveChanges
এছাড়াও, নোট করুন যে এই চেকটির মূল উদ্দেশ্যটি হ'ল এপিআই-র ব্যবহারকারীর কাছে বন্ধুত্বপূর্ণ বার্তা এবং জ্ঞাত এইচটিটিপি স্থিতি ফিরিয়ে দেওয়া এবং ডাটাবেস ব্যতিক্রমগুলি সম্পূর্ণ উপেক্ষা না করা। এবং কেবল স্থানটির ব্যতিক্রম insideুকলে SaveChanges
বা SaveChangesAsync
কল করা হয় ... সুতরাং যখন আপনি কল করবেন FindAsync
বা বলবেন তখন কোনও ব্যতিক্রম হবে না Any
। সুতরাং যদি শিশু বিদ্যমান থাকে তবে পূর্বে মুছে ফেলা হয়েছে SaveChangesAsync
তবে সম্মতিযুক্ত ব্যতিক্রম নিক্ষেপ করা হবে।
আমি এই বাস্তবতার কারণে এটি করেছি যে " foreign key violation
ব্যতিক্রমী আইডি {পিতামাতার সাথে শিশু প্রদর্শন করতে ফর্ম্যাট করা ব্যতিক্রমটি আরও কঠিন hard" শিশু আইড। খুঁজে পাওয়া যায় নি।
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;
}
পোস্টগ্রাসের দ্বিতীয় উদাহরণটি 23503 foreign_key_violation
ত্রুটি ছুঁড়ে ফেলবে : https://www.postgresql.org/docs/9.4/static/errcodes-appendix.html
EF এর মতো ওআরএম-এ এইভাবে ব্যতিক্রমগুলি হ্যান্ডল করার খারাপ দিকটি এটি কেবল একটি নির্দিষ্ট ডাটাবেস ব্যাকএন্ডের সাথে কাজ করবে। আপনি যদি কখনও এসকিউএল সার্ভার বা অন্য কোনও কিছুতে স্যুইচ করতে চেয়েছিলেন তবে এটি আর কাজ করবে না কারণ ত্রুটি কোডটি পরিবর্তিত হবে।
শেষ-ব্যবহারকারীর জন্য ব্যতিক্রমটি সঠিকভাবে বিন্যাস করা না এমন কিছু জিনিস প্রকাশ করতে পারে যা আপনি চাইছেন না তবে বিকাশকারীরা দেখতে চান।
সম্পর্কিত:
https://stackoverflow.com/questions/308905/should-there-be-a-transaction-for-read-queries
Child with id {parent.ChildId} could not be found.
। এবং "বিদেশী কী লঙ্ঘন" ফর্ম্যাট করা আমার মনে হয় এই ক্ষেত্রে আরও খারাপ।