首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在简单语句上找不到行或更改了LINQ C#错误

在简单语句上找不到行或更改了LINQ C#错误
EN

Stack Overflow用户
提问于 2010-11-05 17:43:27
回答 4查看 20.5K关注 0票数 19

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

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

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

更新这是一个非常奇怪的问题:错误是由更新matchingTrans.Url引起的(参见倒数第二行代码)。注释掉这一行并不会抛出错误--即使matchingTrans.Title仍然在更新。

代码语言:javascript
复制
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.
        }
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-05 19:19:17

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

事实证明,该字段只是被另一个开发人员更改为允许空值,并且Linq- to -SQL文件没有相应地更新。

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

票数 49
EN

Stack Overflow用户

发布于 2011-11-10 23:04:33

查看sql server服务器级别的连接属性"No Count“。

  1. 在对象资源管理器中右键单击Sql server连接-->Property
  2. 转到连接选项卡/页
  3. 查找默认连接选项"no count“
  4. 确保未选中此选项。
票数 3
EN

Stack Overflow用户

发布于 2015-03-12 23:16:53

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4104797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档