هل من المقبول الاعتماد على محاولة الالتقاط في طريقة CreateOrUpdate لـ Entity Framework؟

StackOverflow https://stackoverflow.com/questions/643731

سؤال

هل من المقبول القيام بذلك؟حاول أولاً إضافة الكيان.إذا فشلت الإضافة فلا يهم لأن ذلك يعني أن الكيان موجود بالفعل؟

أم أن هناك حل أكثر أناقة/سهلة؟

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();

try
{
    dal.AddToXXXXXX(xxxxxxx);
}
catch
{

}

try
{
    dal.SaveChanges();
    return true;
}
catch
{
    return false;
}

حسنًا لقد اختصرتها إلى ...

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();

if(xxxxxxx.ID == 0)
{
    dal.AddToXXXXXX(xxxxxxx);
}

try
{
    dal.SaveChanges();
    return true;
}
catch
{
    return false;
}
هل كانت مفيدة؟

المحلول

فمن المؤكد أنها ل لا موافق للقيام بذلك.عبارة الالتقاط بدون نوع في C# تعني "التقاط أي استثناء قياسي أو غير قياسي".لكن نيتك هي منع إضافة مكررة.يمكن أن تفشل عمليات الإضافة لعدة أسباب لا تشير إلى وجود إدخال موجود.على سبيل المثال، يمكن أن تقوم هذه الطريقة بطرح مرجع فارغ وتفترض أنه تمت إضافته.

إذا كنت تريد التحقق من وجود إضافة مكررة، يمكنك يجب احصل فقط على الاستثناء الذي تم طرحه للإضافة المكررة.

نصائح أخرى

قد ترغب في البدء بأسلوب نمط IfExists، ثم تخطي حفظ التغييرات ما لم تكن لديك تغييرات بالفعل.

كما أشار Lucas، فإن كتل محاولة الالتقاط لها عبء كبير إذا وقعت في كتلة الالتقاط، لذلك بشكل عام لا تريد الاعتماد على ذلك ما لم تكن هناك طريقة ممكنة لتحديد ما إذا كان العنصر موجودًا بالفعل.

لا تستخدم محاولة الالتقاط للقيام بمهمة عبارة If.محاولة الالتقاط مخصصة للأحداث غير المتوقعة غير العادية.

يحررفي التعليمات البرمجية المحدثة، فشلت في اكتشاف الاستثناء الذي قد يتم طرحه بواسطة الأسلوب "AddToXXXXXX".

يجب عليك أن تفعل

If(!XXXXXX.Contains(newItemValue))
{
   try
   {
      add...
      savechanges...
   }
   catch
   {

   }
}

وبدلاً من ذلك، يمكنك فصل الإضافة وحفظ التغييرات إلى كتل محاولة التقاط مختلفة، ولكن هذا ضروري فقط إذا تم تنفيذ SaveChanges حتى عند فشل الإضافة.

هل يمكن أن يحل محل أول محاولة-الصيد مع بيان إذا، أعتقد أنك سوف لا تزال ترغب في ثانية واحدة على الرغم من.

تعديل: هو أيضا ليس من المستحسن مجرد التقاط كافة الاستثناءات في كتلة واحدة دون النظر إلى ما هي عليه.

وP.S. محاولة كتل اقبض استخدام المزيد من قوة المعالجة (الوقت) من إذا البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top