列が見つかりませんまたは変更されたlinq c#simpleステートメントでエラー
-
29-09-2019 - |
質問
まず第一に、私はデータベースの開発バージョンに地元で作業しているため、これがマルチユーザーの問題である可能性はありません。
私はあまり説明的ではないことを得ています Row not found or changed
db.submitchanges()を実行するとエラーがスローされます。 Submitchanges()が発生する直前に実行を破ると、SQL Server Management StudioとThe Rowをチェックできます します 存在!
これが関数全体のコードです。助けたい人のためにコンテキストに置くためだけですが、問題行は最後にあります(48行目)。
アップデート これは非常に奇妙なものです。エラーは、MatchingTrans.URLを更新することによって引き起こされます(2番目のコード行を参照)。この行をコメントすることは、マッチングトランスがまだ更新されていても、エラーを投げかけません。
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.
}
}
}
解決
SQLプロファイラーの出力を見ると、これに対する答えを理解するのに役立ちました。生成されたSQLの悪い部分がありました WHERE 0 = 1
...明らかなエラー。
別の開発者によるヌルを許可するためにフィールドが単に変更されており、それに応じてLinq-to-SQLファイルが更新されていなかったことがわかりました。
要するに、 Row not found or changed
エラーメッセージは理由もなく生成されているように見えます、 データベーススキーマが.dbmlファイルに正確に一致していることを確認してください それ以外の場合、スキーマがわずかに異なるフィールドでこのエラーメッセージが表示されます。
他のヒント
SQL Serverレベルでの接続プロパティ「Noカウント」をご覧ください
1.オブジェクトエクスプローラーのSQLサーバー接続を右クリック - >プロパティ
2. [接続]タブ/ページに移動します
3.デフォルトの接続オプション「No Count」を探します
4.このオプションがチェックされていないことを確認してください。
ここに答えの優れたリストに追加することがわかった別の可能性:
データベースでnullableではない列を使用する場合、それを本質的に無意味なデータ型にマッピングする場合(この例では、dbタイプはc#のバイト配列にマッピングされていない長いブロブです)。まったく同じバイト配列を使用したデータベースにより、このエラーがスローされます。
例:ユーザーがデータベースに画像をアップロードできるWebサイトがあります。あなたのテーブルには、NullableではないBlob(SQL Serverの画像)があります。ユーザーは、すでにそこにあるのとまったく同じ画像でレコードを更新することを選択します。更新チェックは失敗します。最初に.sequence equal()checkを実行してから、これを修正し、次に着信バイト配列が既存のバイト配列と等しくない場合にコンテキストオブジェクトで.submitchanges()を呼び出します。
データベーススキーマとDBMLが正確に一致した場合でも、この問題がありました。問題は、私がエンティティを変更し、単一のサブミッチングステートメントにエンティティを挿入しようとしていたことでした。私はそれをすべての操作で一度にではなく、各操作でサブミッチャンガンを行うことで修正しました。
これはすべてトランザクションの範囲であったので、それと何か関係があるかもしれませんが、私は確信していません。