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

わんくま同盟

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

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

■85828 / 2階層)  LINQ to SQL:
□投稿者/ 魔界の仮面弁士 (1482回)-(2017/11/28(Tue) 12:28:50)
2017/11/28(Tue) 12:49:13 編集(投稿者)

No85785 (ぬる さん) に返信
> 最後のSubmitChangesで
> 「既に使用されているキーを持つエンティティは追加できません。」
> という例外になってしまいます。

このあたりの処置と調査が手間だったので、個人的には
LINQ to SQL の採用を早々に中止しました…どうするべきなんでしょうね。


> db.Refresh(...)はいろいろやってみてるのですが結果は変わらずです。

Using db As New SomeDataContext(something)
  db.Log = Console.Out

  db.Connection.Open()
  db.Transaction = db.Connection.BeginTransaction() 'TransactionScope なし

  db.Student.InsertOnSubmit(New Student() With {.Id = 1, .Name = "a"})
  db.SubmitChanges() '★1

  ' Delete
  Dim r = db.ExecuteCommand("delete from Student where Id = 1") '戻り値 1
  db.SubmitChanges() '★2

  'db.ClearCache() '☆

  Dim d1 = db.Student.FirstOrDefault(Function(x) x.Id = 1) '★3
  Dim d2 = db.Student.FirstOrDefault(Function(x) x.Id = 2) '★4
  
  ' Insert
  db.Student.InsertOnSubmit(New Student() With {.Id = 1, .Name = "a"})
  db.SubmitChanges() '★5
  
  db.Transaction.Commit()
End Using

この場合、★1、★2、★4 のタイミングで SQL が実行されていることが伺えますが、
★3 では SQL が実行されておらず、d1 IsNot Nothing となってしまいます。

そのため、★5 の段階で DuplicateKeyException が投げ飛ばされています。全力で。


> お手数をおかけしますが、ご回答、よろしくお願いします。

コンテキストを再生成するか、キャッシュをクリアすれば ★5 も通りますが、
私はキャッシュクリアのための正攻法を見つけることができませんでした。


一応、リフレクションを用いて、上記 ☆ を強制的に呼び出すことで
対処できることは経験的に分かっていますが、副作用については
調査しきれていないので、動作保証はできません。

https://referencesource.microsoft.com/#System.Data.Linq/DataContext.cs#194


Imports System.Reflection
Friend Module ContextExtensions
 <System.Runtime.CompilerServices.Extension()>
 Friend Sub ClearCache(ByVal this As System.Data.Linq.DataContext)
  Dim f = BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic
  this.GetType().GetMethod("ClearCache", f).Invoke(this, Nothing)
 End Sub
End Module
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[1]: LINQ to SQL: /ぬる →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
  └ LINQ to SQL: / 魔界の仮面弁士 (17/11/28(Tue) 12:28) #85828 ←Now
    │├ Re[4]: LINQ to SQL: / WebSurfer (17/11/28(Tue) 12:26) #85827
    │└ 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

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