Dapper의 캐시 재설정

asp.net-mvc c# dapper

문제

Dapper가 생성하는 캐시를 재설정하는 방법이 있습니까? 내 데이터베이스에 테이블 열을 떨어 뜨 렸는데 "열을 찾을 수 없습니다."라는 오류가 나타납니다. 나는 IIS를 리셋하고 그 이후에 문제가 없다.

IIS를 다시 시작하지 않고 재설정 할 수 있습니까? 감사.

인기 답변

업데이트 2018-02-08

이 답변은 거의 5 년 전에 작성되었으므로 Dapper 코드가 상당히 바뀌 었습니다. Marc Gravell이 질문에 대해 언급 한 바와 같이, 질문이 제기되었을 때 이것이 필요하지 않아야했기 때문에 오늘은별로 유용하지 않을 것입니다.

코드가 더 이상 작동하지 않을 수도 있습니다. 여전히 효과가 있다고하더라도 최선의 선택이 아니므로 선의로 추천 할 수는 없습니다. 자신의 책임하에 사용하십시오.


Database.cs의 227 행은 다음을 보여줍니다.

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);
    }
}

그것은 사적이라는 것을 의미합니다. 나는 당신이 Reflection으로 접근 할 수 있을지조차 확신하지 못한다. 가장 좋은 방법은 오픈 소스이므로 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
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.