Строка не найдена или изменена. Ошибка LINQ C # в простом операторе. - PullRequest
18 голосов
/ 05 ноября 2010

Прежде всего, нет никаких шансов, что это многопользовательская проблема, так как я работаю локально над версией 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.
        }
    }
}

Ответы [ 4 ]

47 голосов
/ 05 ноября 2010

Глядя на вывод SQL Profiler, он помог мне найти ответ на этот вопрос. Был сгенерирован неверный фрагмент SQL, который закончился WHERE 0 = 1 ... очевидной ошибкой.

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

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

3 голосов
/ 10 ноября 2011

Взгляните на свойство соединения "No Count" на уровне сервера sql server.

1. Щелкните правой кнопкой мыши по соединению с Sql-сервером в Object Explorer -> Property.
2. Перейти на вкладку / страница подключения
3. Поищите вариант подключения по умолчанию "no count"
4. Убедитесь, что эта опция не отмечена.

2 голосов
/ 12 марта 2015

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

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

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

1 голос
/ 24 февраля 2012

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

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

...