首先,这不可能是一个多用户问题,因为我正在本地处理数据库的一个开发版本。
当我执行db.SubmitChanges()时,我得到了不太解释性的Row not found or changed
错误被抛出。如果我恰好在SubmitChanges()发生之前中断执行,我就可以在SQL Server Management Studio中签入,并且该行确实存在!
这里是整个函数的代码,只是为了帮助任何想要帮助的人,但问题行就在最后(第48行)。
更新这是一个非常奇怪的问题:错误是由更新matchingTrans.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.
}
}
}
发布于 2010-11-05 19:19:17
查看SQL Profiler输出,它帮助我找到了这个问题的答案。生成了一段以WHERE 0 = 1
结尾的错误的SQL ...一个明显的错误。
事实证明,该字段只是被另一个开发人员更改为允许空值,并且Linq- to -SQL文件没有相应地更新。
简而言之,如果Row not found or changed
错误消息似乎是无缘无故地生成的,请确保您的数据库模式与您的.dbml文件完全匹配,否则您将在模式稍有不同的任何字段上收到此错误消息。
发布于 2011-11-10 23:04:33
查看sql server服务器级别的连接属性"No Count“。
发布于 2015-03-12 23:16:53
我发现的另一种可能性是添加到这里的优秀答案列表中:
当在数据库中使用不可为空的列时-然后将其映射到本质上可为空的数据类型(在本例中,DB类型是LONG BLOB NOT NULL映射到c#中的字节数组),您可能会遇到这样一种情况:用完全相同的字节数组更新数据库会导致抛出此错误。
示例:您有一个允许用户将图像上传到数据库的网站。您的表有一个不可为空的blob ( sql server中的图像)。用户选择用已经存在的完全相同的图像来更新记录。更新检查将失败。我修复了这个问题,首先执行.SequenceEqual()检查,然后如果传入的字节数组不等于现有的字节数组,则只在上下文对象上调用.SubmitChanges()。
https://stackoverflow.com/questions/4104797
复制相似问题