C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.85827 の関連記事表示

<< 0 >>
■85827  Re[4]: LINQ to SQL:
□投稿者/ WebSurfer -(2017/11/28(Tue) 12:26:48)
    No85824 (ぬる さん) に返信

    > ExecuteCommandのDeleteは間にSelectを入れて正常に削除されていることを確認しています。
    > Linqでも生SQLでも、Delete→Selectは問題ないです。
    > データが削除されていないとすればDB側で主キー違反になりますが、
    > 「既に使用されているキーを持つエンティティは追加できません。」というエラーはDB側の主キー違反とは別物だと思います。

    ということは、また想像が入ってますが、

    (1) Linq to Entity の場合、編集・更新操作を行うには対象となるレコードのエンティティオブジェクトの
      状態を、登録なら Added、編集なら Modified、削除なら Deleted としてマークし、DbContext.SaveChanges
      メソッドを適用します。(これは想像ではありません)

    (2) ここからは想像が入っていますが、Linq to SQL でも (1) と同様であろうと思われます。

    (3) ところが、ExecuteCommand("delete ...") では当該エンティティに Deleted マークは付かない。なので、
      db.SubmitChanges メソッドは意味がない。でも、SQL Server の当該レコードは削除される。

    (4) コンテキスト db は上記 (3) の操作は知らない。当該エンティティの状態は Deleted にはなっていない。
      Unchanged のまま。

    (5) その状態で、db.Student.InsertOnSubmit で新たに Id = 1 の Student エンティティをコンテキスト db
      に追加(そのエンティティの状態は Added になる)。

    (6) 結果、Id = 1 で Unchanged マークがついたエンティティと、同じく Id = 1 で Added マークがついた
      エンティティの両方がコンテキストに存在することになる。

    (7) db.SubmitChangesで「既に使用されているキーを持つエンティティは追加できません」という結果になる。

    ・・・ということであろうと思われます。(furu さんの No85825 もそのことを言われていると思います)

    上記の想像が当たっていれば、以下のようにすればよさそうです。

    (a) 上記 (5) で InsertOnSubmit に代えて ExecuteCommand("insert ...") を使う、or

    (b) furu さんの言われるようにコンテキストにアタッチされるエンティティを最新のものにしてから
      db.Student.InsertOnSubmit ⇒ db.SubmitChanges を行う。
記事No.85784 のレス /過去ログ147より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -