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

Gre*_*reg 19 c# linq submitchanges linq-to-sql

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

Row not found or changed当我执行db.SubmitChanges()时,我得到了不太明确的错误.如果我在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.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Gre*_*reg 48

查看SQL事件探查器输出,它帮助我找到了答案.生成了一个错误的SQL,结果是WHERE 0 = 1......一个明显的错误.

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

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

  • 我只是有同样的问题,除了我是愚蠢的开发人员改变了allow null属性,允许自己分心,只是意识到我忘了更新我的模型. (4认同)
  • 你应该把它标记为答案,否则寻找未解答问题的人会来这里试图帮助,只是意识到你已经解决了问题... (3认同)
  • 对我来说,架构是使用datetime和带有日期的数据库列创建的...... (2认同)