2009-07-23 15 views
1

私がやっていることは、むしろ単純です。WPF DatagridからLINQ-to-SQL経由で新しいレコードを挿入できません

私はLINQ-to-SQLデータコンテキストをセットアップしており、テーブルの1つはUsersです。デザイナーでは、クラスを「ユーザー」として表示し、ソースを「dbo.Users」としています。アクセスはパブリックで、データベースにアクセスして検索と更新を行うことができます。このクラスは、I/D/U操作に対して「ランタイムを使用」に設定されています。

新しいレコードを追加しようとすると問題が発生します。

  1. 私はAutoGenerateColumns =「真」
  2. CanUserAddRowsに設定データグリッドは
  3. 「真」RowEditEndingイベントがメソッドに設定されているに設定されています。

レコード(データコンテキストでSubmitChanges()を追加すると、何も起こりません。それは単に挿入をしません。私はブレークポイントでローカルオブジェクトをチェックしています。すべての兆候は、それが実際にそこにあり、追加するべき正しいレコードを持っているということです。

しかし、もっと多くのことがあります。

私はUsers.InsertOnSubmit()を実行し、DataGridのCurrentItem(ユーザーにキャスト)を渡すと、「既に存在するエンティティを追加できません」というエラーが表示されますが、レコードが実際に挿入されています。

誰か手掛かりがありますか?

(FWIWは、バックエンドはSQL2K8エクスプレスです)

EDIT:
例外を与えませんが、レコードを追加しませんコードのいずれか:

  private void UserGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
    { 
     ctx.SubmitChanges(); 
    } 

と例外を与えるコード:

 private void UserGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
    { 
     ctx.Users.InsertOnSubmit((User) e.Row.Item); 
     ctx.SubmitChanges(); 
    }  
+0

「全く動作していません」という動作に関連するコードと「エンティティは既に存在します」というエラーを表示するコードを表示できますか? –

答えて

1

問題は、データグリッドと同じデータコンテキストを使用していることです。それをしないでください。小さなタスクごとに新しいデータコンテキストを作成します。長期間同じコンテキストを使用すると蓄積される変更トラッキングよりも安価で、非常に安価です。

0

データベース(主キーなど)に自動生成された列はありますか?

エラーのその種買ってあげること、これらがあればint型ではなく、モデルに自動生成されたとしてマークされていないことをLINQで、過去に私を見つけた:で

Playing with LINQ For SQL in Windows Form Application

を「第2回:隠しカラムの挿入/ Linq DataContextsの自動生成Id」同じエラーメッセージと動作に関する私の問題について説明します。コメントに応答する


編集:

その行の主キーフィールドの値は何ですか?私はそれが既にデータベースに存在するであろう、「0」をデフォルトだと推測している:

ctx.Users.InsertOnSubmit((User) e.Row.Item); 

はあなたが既存の行を編集しているかどうかをチェック試行しましたが、いない場合は、新しいユーザーを作成しますオブジェクトを作成し、フィールドをマッピングして、それをコンテキストInsertOnSubmitに追加しますか?

Brad Abramsは、SilverLight 3 RTM and .NET RIA Services July Update seriesのWinForms部分で同様のことをしています。SilverlightでMaster-Detailビューでこのようなことを行う他の方法も示しています。

+0

PKは自動生成されますが、それはintであり、モデルでは自動生成されたものとしても表示されます。 –

関連する問題