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

わんくま同盟

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

C# と VB.NET の入門サイト

■85827 / 4階層)  LINQ to SQL:
□投稿者/ WebSurfer (1366回)-(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 を行う。

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[3]: LINQ to SQL: /ぬる 返信無し
 
上記関連ツリー

LINQ to SQL: / ぬる (17/11/24(Fri) 11:31) #85784
Re[1]: LINQ to SQL: / ぬる (17/11/24(Fri) 11:36) #85785
  ├ Re[2]: LINQ to SQL: / furu (17/11/24(Fri) 15:55) #85789
  │└ Re[3]: LINQ to SQL: / ぬる (17/11/24(Fri) 16:04) #85790
  ├ Re[2]: LINQ to SQL: / WebSurfer (17/11/25(Sat) 11:09) #85796
  │├ Re[3]: LINQ to SQL: / ぬる (17/11/28(Tue) 09:12) #85824
  ││└ Re[4]: LINQ to SQL: / furu (17/11/28(Tue) 09:38) #85825
  └ Re[2]: LINQ to SQL: / 魔界の仮面弁士 (17/11/28(Tue) 12:28) #85828
    │├ LINQ to SQL: / WebSurfer (17/11/28(Tue) 12:26) #85827 ←Now
    │└ Re[4]: LINQ to SQL: / WebSurfer (17/11/28(Tue) 14:36) #85831
    │  └ Re[5]: LINQ to SQL: / ぬる (17/11/30(Thu) 21:46) #85906
    │    └ Re[6]: LINQ to SQL: / WebSurfer (17/11/30(Thu) 22:01) #85908
    │      └ Re[7]: LINQ to SQL: / ぬる (17/11/30(Thu) 23:56) #85910
    │        └ Re[8]: LINQ to SQL: / WebSurfer (17/12/01(Fri) 00:17) #85911
    │          └ Re[9]: LINQ to SQL: / ぬる (17/12/01(Fri) 09:21) #85913
    │            ├ Re[10]: LINQ to SQL: / 魔界の仮面弁士 (17/12/01(Fri) 10:04) #85914
    │            └ Re[10]: LINQ to SQL: / WebSurfer (17/12/01(Fri) 11:35) #85916
    └ Re[3]: LINQ to SQL: / ぬる (17/11/30(Thu) 21:46) #85905
      └ Re[4]: LINQ to SQL: / ぬる (17/12/04(Mon) 13:46) #85936 解決済み
        └ Re[5]: LINQ to SQL: / WebSurfer (17/12/05(Tue) 13:12) #85952
          └ Re[6]: LINQ to SQL: / ぬる (17/12/06(Wed) 19:57) #85980

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信