لم يتم العثور على الصف أو تغيير خطأ LINQ C# في بيان بسيط

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

سؤال

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

أنا أحصل على التوضيح جدا Row not found or changed خطأ يتم إلقاؤه عند أداء DB.SubMitchanges (). إذا قمت بفك التنفيذ قبل حدوث submitchanges () مباشرة ، يمكنني التحقق من استوديو SQL Server Management والصف يفعل يوجد!

إليك رمز الوظيفة بأكملها ، فقط لوضعها في سياق لأي شخص يريد المساعدة ، لكن خط المشكلة صحيح في النهاية (السطر 48).

تحديث هذا غريب حقًا: يحدث الخطأ من خلال تحديث MatchingTrans.url (انظر خط الرمز قبل الأخير). التعليق على هذا السطر لا يرمي الخطأ - حتى إذا كان لا يزال يتم تحديث MatchingTrans.title.

private static void MenuItemUpdate(int languageId, NavigationItem item)
{
    using (var db = DataContextFactory.Create<MyDataContext>())
    {
        // Select existing menu item from database.
        var dbItem =
            (from i in db.MenuItems
             where i.Id == item.Id
             select i).Single();
        // Obtain ID of link type.
        dbItem.FkLinkTypeId = GetLinkTypeByName(
            Enum.GetName(typeof (NavigationItemLinkType), item.LinkType)).Id;
        // Update the Link field with what is given.
        dbItem.Link = item.Link;
        db.SubmitChanges();

        // Item already exists and needs editing.
        // Get associated translations.
        var trans =
            from t in db.MenuItemTranslations
            where t.FkMenuItemId == item.Id
            select t;

        // If translation exists for given language, edit it.
        var matchingTrans =
            (from t in trans
             where t.FkLanguageId == languageId
             select t).SingleOrDefault();

        if (matchingTrans == null)
        {
            // No matching translation - add one.
            var newDbTrans = new MenuItemTranslation
            {
                FkMenuItemId = item.Id,
                FkLanguageId = languageId,
                Title = item.Title,
                Url = item.FriendlyUrl
            };
            db.MenuItemTranslations.InsertOnSubmit(newDbTrans);
            db.SubmitChanges();
        }
        else
        {
            // Matching translation - edit it.
            matchingTrans.Title = item.Title;
            matchingTrans.Url = item.FriendlyUrl;
            db.SubmitChanges();
            // WTF ERROR: Row not found or changed.
        }
    }
}
هل كانت مفيدة؟

المحلول

بالنظر إلى ناتج SQL Profiler ، فقد ساعدني ذلك في معرفة الإجابة على هذا. كان هناك قطعة سيئة من SQL يتم إنشاؤها والتي انتهت WHERE 0 = 1 ... خطأ واضح.

اتضح أن الحقل قد تم تغييره ببساطة للسماح بموجب مطور آخر ، ولم يتم تحديث ملف LINQ إلى SQL وفقًا لذلك.

باختصار ، إذا كان Row not found or changed يبدو أن رسالة الخطأ يتم إنشاؤها دون سبب ، تأكد من أن مخطط قاعدة البيانات الخاص بك يطابق ملف .dbml الخاص بك بالضبط وإلا ستحصل على رسالة الخطأ هذه على أي حقول لها مخططات مختلفة قليلاً.

نصائح أخرى

ألقِ نظرة على خاصية الاتصال "لا عدد" على مستوى خادم SQL

1. انقر بزر الماوس الأيمن على اتصال خادم SQL في Explorer -> الخاصية
2. انتقل إلى علامة التبويب/صفحة الاتصال
3. ابحث عن خيار الاتصال الافتراضي "لا عدد"
4. تأكد من عدم فحص هذا الخيار.

احتمال آخر وجدت لإضافته إلى قائمة الإجابات الممتازة هنا:

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

مثال: لديك موقع ويب يسمح للمستخدم بتحميل صورة إلى قاعدة البيانات. يحتوي الجدول الخاص بك على نقطة (صورة في SQL Server ، أيا كان) غير قابلة للإلغاء. يختار المستخدم تحديث السجل بنفس الصورة بالضبط الموجودة بالفعل. سوف يفشل التحقق من التحديث. لقد أصلحت هذا عن طريق القيام أولاً بالتحقق من. sequenceequal ثم الاتصال فقط .submitchanges () على كائن السياق إذا لم يكن صفيف البايت الوارد مساوياً للمصاحب الموجود.

واجهت هذه المشكلة حتى عندما يتطابق مخطط قاعدة البيانات و DBML تمامًا. كانت القضية هي أنني كنت أحاول تغيير كيان وإدراج الكيانات في بيان Subclitchanges واحد. لقد قمت بإصلاحه عن طريق القيام بمجموعة Submitchanges في كل عملية بدلاً من كل شيء مرة واحدة.

كان كل هذا في نطاق المعاملات بحيث يكون له علاقة به ولكني لست متأكدًا.

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