Zunächst einmal gibt es keine Chance, dass dies ein Multi-User-Problem ist, da ich lokal auf einer dev-Version der Datenbank arbeite.Zeile nicht gefunden oder geändert LINQ C# Fehler auf einfache Anweisung
Ich bekomme den nicht sehr erklärenden Row not found or changed
Fehler geworfen, wenn ich db.SubmitChanges() ausführen. Wenn ich die Ausführung unterbricht, bevor die SubmitChanges() auftritt, kann ich in SQL Server Management Studio einchecken, und die Zeile existiert vorhanden!
Hier ist der Code für die gesamte Funktion, nur um es in Kontext für jeden, der helfen möchte, zu setzen, aber die Problemlinie ist direkt am Ende (Zeile 48).
Aktualisieren Dies ist ein wirklich seltsames: Der Fehler wird durch Aktualisieren von MatchingTrans.Url (siehe vorletzte Zeile des Codes) verursacht. Wenn Sie diese Zeile auskommentieren, wird der Fehler nicht ausgegeben - selbst wenn das MatchingTrans.Title noch aktualisiert wird.
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.
}
}
}
Haben Sie SQL Profiler? Wenn ja, würde ich mir ansehen, was SQL tatsächlich in der DB ausführt und was die DB daraus macht. Was ist der Primärschlüssel in MenuItemTranslations? –
@Ian Griffiths Danke für die Info, ich werde einen Blick auf SQL Profiler werfen. Der Primärschlüssel ist übrigens Id. – Greg