سؤال

عندما أقوم بإضافة أكثر من بيانات متتالية حدث خطأ في طريقة SaveChanges().

استثناءتم إجراء التغييرات على قاعدة البيانات بنجاح، ولكن حدث خطأ أثناء تحديث سياق الكائن.قد يكون ObjectContext في حالة غير متناسقة.رسالة الاستثناء الداخلي:لا يمكن لـ AcceptChanges الاستمرار لأن القيم الأساسية للكائن تتعارض مع كائن آخر في ObjectStateManager.تأكد من أن قيم المفاتيح فريدة قبل استدعاء AcceptChanges.

الخدمة الأساسية الخاصة بي

public void Delete(T entity)
    {
        ObjectSet.DeleteObject(entity);
        Context.SaveChanges();
    }

    public void Add(T entity)
    {
        ObjectSet.AddObject(entity);
        Context.SaveChanges();

    }

    public void Attach(T entity)
    {
        ObjectSet.Attach(entity);
        Context.SaveChanges();
    }

    public void Update(Expression<Func<T, bool>> where, T entity)
    {
        var ent = First(where);
        ent = entity;
        Context.SaveChanges();
    }
هل كانت مفيدة؟

المحلول

هل أنت متأكد من أنك تضيف مختلف الكيانات إلى EF؟الاستثناء الداخلي ينص على ذلك AcceptChanges() يفشل لأن الكيان الحالي الذي تحاول إضافته يشارك مفتاحًا مع كيان يتم تعقبه بالفعل.

للمزيد عن AcceptChanges(), ، ألق نظرة على: http://msdn.microsoft.com/en-us/library/system.data.objects.objectstateentry.acceptchanges.aspx

نصائح أخرى

كان لدي هذه المشكلة ووجدت أنني أقوم بالعمليات التالية، مما يجعل العمل منفيا لتصبح غير مزامنة مع البيانات في قاعدة البيانات:

1) قم بإجراء استفسار على صفوف جدول من خلال سياق إطار الكيان. القيام بذلك، يحافظ سياق EntityFrameWork على نسخة من هذه الكائنات في رأيها المحلي.

2) اقتطاع الجدول من خلال استعلام SQL (حتى سياق إطار الكيان لم يحدث هذا يحدث. الكيانات لا تزال في وجهة نظرها المحلية حتى لو تم اقتطاعها في قاعدة البيانات). نظرا لأن المفتاح الأساسي للجدول هو زيادة تلقائية (الهوية (1،1))، فإن مكالمة الاقتطاع تجعل العداد الرئيسي الأساسي من الجدول للإعادة تعيين إلى 1.

3) إضافة صفوف إلى الجدول عبر إطار الكيان، ثم اتصل ب Savechanges (). بسبب اقتطاع الجدول، فإن المفتاح الأساسي للصف الجديد هو 1. بعد إنشاء الصف، فإن استعلامات EntityFrameWork لعملية قاعدة البيانات لقيم الصف، تنشئ كيان جديد، يملأ القيم في الكيان ويضيف الكيان إلى عرضه المحلي .

لأن السياق كان لديه بالفعل كائن آخر مع المفتاح الأساسي= 1 مخزز في رأيها المحلي (من الخطوة 1)، يتم إلقاء استثناء لأنه يحاول إضافة كيان ثان بنفس المفتاح الأساسي نفسه للرؤية المحلية.

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

في حالتي، كان علي إصلاح هذا عن طريق الاتصال: giveacodicetagpre.

لذلك تم حذف الكيانات أولا، وقد أخبر السياق عن ذلك. ثم اقتطعت الجدول باستخدام استعلام SQL لإعادة ضبط عداد الزيادة التلقائي.

منذ تم حذف الكائنات من الرأي المحلي أولا، يتم اقتطاع الجدول بعد ذلك (حتى يتم إعادة تعيين عداد الزيادة التلقائي)، تم تجنب النزاعات الرئيسية الأولية.

نأمل أن يساعد.

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