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

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

当我执行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()) { // 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. } } } 

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

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

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

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

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

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

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

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

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

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