name_untitledのエッセイ

IT関係で知ったことなどを記事としてあげていきます。内容に不備や質問などあればぜひコメントをよせてください。

LINQ to SQLではまった。 素直にやれば簡単だったのに。

Web Form ではLINQtoSQLを使ってDBアクセスしたことなかったので、

ちょっとしたアプリを作るのに使ってみたら思いっきりはまった。

FormViewでデータの登録は出来たのだが、編集が出来ない。

f:id:name_untitled:20150902234536p:plain

からの

f:id:name_untitled:20150902235219p:plain

これ。

'/' アプリケーションでサーバー エラーが発生しました。

行が見つからないか変更されています。
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.Data.Linq.ChangeConflictException: 行が見つからないか変更されています。

ソース エラー:


現在の Web 要求の実行中にハンドルされていない例外が生成されました。障害の原因および発生場所に関する情報については、下の例外スタック トレースを使って確認できます。

スタック トレース:

 

[ChangeConflictException: 行が見つからないか変更されています。]
System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) +934622
System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +391
System.Web.UI.WebControls.LinqToSqlWrapper.SubmitChanges(DataContext dataContext) +23
System.Web.UI.WebControls.LinqDataSourceView.UpdateDataObject(Object dataContext, Object table, Object oldDataObject, Object newDataObject) +108
System.Web.UI.WebControls.LinqDataSourceView.UpdateObject(Object oldEntity, Object newEntity) +246
System.Web.UI.WebControls.QueryableDataSourceView.ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) +103
System.Web.UI.WebControls.ContextDataSourceView.ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) +95
System.Web.UI.WebControls.LinqDataSourceView.ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) +42
System.Web.UI.DataSourceView.Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback) +106
System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow row, Int32 rowIndex, Boolean causesValidation) +1210
System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +877
System.Web.UI.WebControls.GridView.OnBubbleEvent(Object source, EventArgs e) +89
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +90
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +121
System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +161
System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +12
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +15
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +9721782
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1639

どういうことだ?!意味が不明。

色々戻したりして見たが直らず。

 必死にググったら、答えが見つかった。

.net - What can I do to resolve a "Row not found or changed" Exception in LINQ to SQL on a SQL Server Compact Edition Database? - Stack Overflow

ベストアンサーが面白かった。

Double check for nullable!

と書いてあったが、ほんとにそれが原因。ありがとうございました。

LINQ to SQL クラスを追加したあとで、テーブルにAutoincrementを付与した際に、Nullableの設定を触ってしまっていた。

内部的には、更新のキーからはずれてしまってデータが見つからない、になってしまうのだろうか。

f:id:name_untitled:20150903000335p:plain

取りあえず、Nullableをテーブルの定義と合わせて、読み取り専用をTrueにしてたのを戻して、一件落着。

 

このサイトを参考に作成中。お世話になっております。

EnabelDynamicDataで簡単データ検証(LINQ to SQL 編) | どっとねっとふぁん