2012-03-08 12 views
7

Dapperが生成するキャッシュをリセットする方法はありますか?私はデータベースにテーブルの列を落としました。そして、私はエラー "カラムが見つかりませんでした。"私はIISをリセットし、その後はうまくいった。Dapperのキャッシュをリセットする

IISを再起動せずにリセットできますか?ありがとう。

+0

しかし、このための方法が*公開される可能性があります。私たちは実際にスキーマの変更を特に対象とするいくつかのコードを持っていて、静かにリカバリすることを意図しています。このリカバリコードにヒットしなかったのは奇妙です。 –

+0

@MarcGravell - 私が提案した拡張メソッドは、実際に問題を解決するために何をしますか?最高のところでは貧弱な推測でしたが、私がDapperのコードを読んでいたときにはうれしかったです。 –

+0

@ M.Babcock私はそれをテストしていませんが、助けてくれるようです。 –

答えて

7

更新は2018年2月8日

Dapperのコードは、この答えは、ほぼ5年前に書かれたので、かなり変更されています。 Marc Gravellが質問にコメントしたように、質問が尋ねられたときにはこれが必要ではないはずだったので、今日でもあまり使われないでしょう。

コードはもう動作しない場合もあります。それでも機能していても、それは最適ではないので、私はそれを誠実に推薦できませんでした。自己責任。


ライン227 Database.csのショー:それはプライベートであることを意味し

static ConcurrentDictionary<Type, string> tableNameMap = new ConcurrentDictionary<Type, string>(); 
static ConcurrentDictionary<Type, List<string>> paramNameCache = new ConcurrentDictionary<Type, List<string>>(); 

。私はあなたがリフレクションでそれにアクセスできるかどうかも分かりません。最善の策は、(オープンソースであるため)ClearCacheメソッドをソースに追加し、レビューのために提出することです。

Sam SaffronまたはMarc Gravellが詳しく説明している可能性があります。

public static class DapperExtensions 
{ 
    public static void ClearTableCache<TDatabase>(this Database<TDatabase> dapperDb) 
    { 
     var fld = dapperDb.GetType().GetField("tableNameMap", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); 
     if (fld == null) 
      throw new NotSupportedException("Unable to locate Private field tableNameMap"); 

     var obj = fld.GetValue(null); 
     if (obj == null) 
      throw new NotSupportedException("Unable to get value from tableNameMap"); 

     var clear = obj.GetType().GetMethod("Clear"); 
     if (clear == null) 
      throw new NotSupportedException("Unable to locate ConcurrentDictionary<T, U>.Clear"); 

     clear.Invoke(obj, null); 
    } 
    public static void ClearParamCache<TDatabase>(this Database<TDatabase> dapperDb) 
    { 
     var fld = dapperDb.GetType().GetField("paramNameCache", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); 
     if (fld == null) 
      throw new NotSupportedException("Unable to locate Private field paramNameMap"); 

     var obj = fld.GetValue(null); 
     if (obj == null) 
      throw new NotSupportedException("Unable to get value from paramNameMap"); 

     var clear = obj.GetType().GetMethod("Clear"); 
     if (clear == null) 
      throw new NotSupportedException("Unable to locate ConcurrentDictionary<T, U>.Clear"); 

     clear.Invoke(obj, null); 
    } 
} 

それはDapperのでテストされていませんが、私は原則をテストした:私はDapperのを使用していないが、私は次の拡張方法はレポでバージョンで動作するはずだと思う


POCOを使ってプライベートAPIへのアクセスは危険です(せいぜい)が、このコードサンプルで使用されているリフレクションは現在のバージョンで動作するはずです。

+0

Dapperの現在のバージョンで動作する拡張メソッドを含めるように更新されました。 –

+0

パラメータキャッシュをクリアするための拡張メソッドを追加し、静的フィールド(最初は見落とされています)で正しく動作するように両方を修正しました。 –

関連する問題