Подтвердить что ты не робот

Строка не найдена или не изменена ошибка LINQ С# в простой инструкции

Прежде всего, нет никакой вероятности, что это проблема с несколькими пользователями, поскольку я работаю локально в dev-версии базы данных.

Я получаю не очень объяснительную ошибку Row not found or changed, возникающую при выполнении db.SubmitChanges(). Если я нарушу выполнение перед тем, как произойдет событие SubmitChanges(), я могу проверить в SQL Server Management Studio, и строка существует!

Вот код для всей функции, просто чтобы поместить ее в контекст для тех, кто хочет помочь, но проблема в конце строки (строка 48).

Обновление Это действительно странно: ошибка вызвана обновлением matchTrans.Url(см. предпоследнюю строку кода). Комментирование этой строки не вызывает ошибки - даже если matchTrans.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.
        }
    }
}
4b9b3361

Ответ 1

Посмотрев на выход SQL Profiler, он помог мне разобраться в этом. Существовал плохая часть SQL, сгенерированная, которая заканчивалась WHERE 0 = 1... очевидной ошибкой.

Оказывается, что поле было просто изменено, чтобы разрешить null другим разработчиком, и файл Linq-to-SQL не был соответствующим образом обновлен.

Короче говоря, если сообщение об ошибке Row not found or changed появляется без причины, убедитесь, что ваша схема базы данных точно соответствует вашему .dbml файлу, вы получите это сообщение об ошибке в любых полях которые имеют несколько отличающиеся схемы.

Ответ 2

Посмотрите на свойство подключения "Нет счета" на уровне сервера сервера sql

1. Щелкните правой кнопкой мыши на подключении сервера Sql в Обозревателе объектов → Свойство
2. Перейдите на вкладку/страницу подключения
3. Найдите вариант подключения по умолчанию "no count"
4. Убедитесь, что этот параметр не установлен.

Ответ 3

Еще одна возможность, которую я нашел, чтобы добавить отличный список ответов здесь:

При использовании столбца с недействительными значениями в базе данных, а затем сопоставление с типом данных, который является обнуляемым по умолчанию (в этом примере тип DB - LONG BLOB NOT NULL, сопоставленный с массивом байтов в С#), вы можете оказаться в ситуации где обновление базы данных с помощью того же самого байтового массива вызывает эту ошибку.

Пример. У вас есть веб-сайт, который позволяет пользователю загружать изображение в базу данных. В вашей таблице есть blob (изображение в sql-сервере, что угодно), которое не равно NULL. Пользователь решает обновить запись тем же самым изображением, которое уже существует. Проверка обновления завершится с ошибкой. Я исправил это, сначала выполнив проверку .SequenceEqual(), а затем только вызывающий .SubmitChanges() в объекте контекста, если входящий массив байтов не был равен существующему.

Ответ 4

У меня была эта проблема, даже если схема базы данных и dbml точно совпадали. Проблема заключалась в том, что я пытался изменить объект и вставить объекты в один оператор SubmitChanges. Я исправил его, выполнив SubmitChanges для каждой операции, а не сразу.

Все это было в области транзакций, поэтому возможно, что-то с этим связано, но я не уверен.