在简单语句中未找到或更改LINQ C#错误的行

时间:2010-11-05 09:43:27

标签: c# linq linq-to-sql submitchanges

首先,这不是一个多用户问题,因为我在本地数据库的开发版本上工作。

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

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

更新这是一个非常奇怪的错误:错误是由更新matchingTrans.Url引起的(请参阅倒数第二行代码)。注释掉这一行并不会引发错误 - 即使匹配的Trans.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 个答案:

答案 0 :(得分:47)

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

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

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

答案 1 :(得分:3)

在sql server服务器级别查看连接属性“No Count”

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

答案 2 :(得分:2)

我发现的另一种可能性是添加到优秀的答案列表中:

在数据库中使用不可为空的列时 - 然后将其映射到本质上可为空的数据类型(在此示例中,DB类型为LONG BLOB NOT NULL映射到c#中的字节数组),您最终可能处于某种情况使用完全相同的字节数组更新数据库会导致抛出此错误。

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

答案 3 :(得分:1)

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

这一切都在交易范围内,所以可能与它有关,但我不确定。