19

首先,这不可能是多用户问题,因为我正在本地处理数据库的开发版本。

Row not found or changed当我执行 db.SubmitChanges() 时,我得到了一个不太解释的错误。如果我在 SubmitChanges() 发生之前中断执行,我可以检查 SQL Server Management Studio 并且该行确实存在!

这是整个函数的代码,只是为了给任何想要帮助的人提供上下文,但问题行就在最后(第 48 行)。

更新这是一个非常奇怪的错误:错误是由更新 matchTrans.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.
        }
    }
}
4

4 回答 4

49

查看 SQL Profiler 输出,它帮助我找到了答案。生成了一段糟糕的 SQL,它以WHERE 0 = 1……一个明显的错误结束。

事实证明,该字段已被其他开发人员简单地更改为允许空值,并且 Linq-to-SQL 文件没有相应地更新。

简而言之,如果Row not found or changed错误消息似乎是无缘无故生成的,请确保您的数据库架构与您的 .dbml 文件完全匹配,否则您将在架构略有不同的任何字段上收到此错误消息。

于 2010-11-05T11:19:16.820 回答
3

查看 sql server 服务器级别

1 的连接属性“No Count”。在对象资源管理器中右键单击 Sql server 连接 --> 属性
2。转到连接选项卡/页面
3。查找默认连接选项“无计数” "
4. 确保未选中此选项。

于 2011-11-10T15:04:32.930 回答
2

我发现的另一种可能性可以添加到此处的出色答案列表中:

在数据库中使用不可为空的列时 - 然后将其映射到本质上可以为空的数据类型(在此示例中,数据库类型是 LONG BLOB NOT NULL 映射到 c# 中的字节数组),您最终可能会遇到更新具有完全相同字节数组的数据库会导致引发此错误。

示例:您有一个网站,允许用户将图像上传到数据库。您的表有一个不可为空的 blob(sql server 中的图像等)。用户选择使用已经存在的完全相同的图像来更新记录。更新检查将失败。我通过首先进行 .SequenceEqual() 检查,然后仅在传入字节数组不等于现有字节数组时才在上下文对象上调用 .SubmitChanges() 来解决此问题。

于 2015-03-12T15:16:53.237 回答
1

即使数据库模式和 dbml 完全匹配,我也遇到了这个问题。问题是我试图更改实体并在单个 SubmitChanges 语句中插入实体。我通过对每个操作执行 SubmitChanges 来修复它,而不是一次全部执行。

这一切都在事务范围内,因此可能与它有关,但我不确定。

于 2012-02-23T21:10:10.530 回答