Dapperのキャッシュをリセットする

asp.net-mvc c# dapper

質問

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

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

人気のある回答

アップデート2018-02-08

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

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


Database.csの 227行目は次のようになります。

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)が詳しく説明するかもしれない。


私はDapperを使っていませんが、次の拡張メソッドはRepoのバージョンで動作するはずです:

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でテストされていませんが、私はPOCOを使って原理をテストしました。プライベートAPIへのアクセスは危険です(せいぜい)が、このコードサンプルで使用されているリフレクションは現在のバージョンで動作するはずです。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow