2012-03-08 31 views
7

Có cách nào để đặt lại bộ nhớ cache mà Dapper tạo ra không? Tôi đã bỏ một cột bảng trong cơ sở dữ liệu của mình, và tôi đã nhận được lỗi "không tìm thấy cột". Tôi đặt lại IIS và nó hoạt động tốt sau đó.Đặt lại bộ nhớ cache cho Dapper

Điều này có thể được đặt lại mà không cần khởi động lại IIS không? Cảm ơn.

+0

Chúng tôi có thể có thể * phơi bày * một phương pháp cho việc này, tuy nhiên; chúng tôi thực sự có một số mã nhắm mục tiêu cụ thể các thay đổi của lược đồ và được thiết kế để khôi phục âm thầm - thật kỳ lạ là mã không đạt được mã khôi phục này. –

+0

@MarcGravell - Các phương pháp mở rộng mà tôi đề xuất có thực sự làm gì để giải quyết vấn đề không? Đó là một phỏng đoán nghèo nàn nhất, nhưng nó có vẻ tốt khi tôi đọc qua mã Dapper. –

+0

@ M.Babcock Tôi chưa thử nghiệm nó, nhưng có vẻ như nó sẽ giúp –

Trả lời

7

Cập nhật 2018-02-08

Mã Dapper đã thay đổi khá nhiều kể từ khi câu trả lời này đã được viết gần như 5 năm trước đây. Như Marc Gravell đã bình luận về câu hỏi này, điều này không cần thiết khi câu hỏi được hỏi nên có khả năng hôm nay nó sẽ không được sử dụng nhiều.

Mã có thể hoặc không hoạt động nữa. Ngay cả khi nó vẫn hoạt động, nó không phải là tối ưu vì vậy tôi không thể khuyên bạn nên nó trong đức tin tốt. Sử dụng có nguy cơ của riêng bạn.


dòng 227 của Database.cs show:

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

có nghĩa là nó là tư nhân. Tôi thậm chí không chắc chắn bạn sẽ có thể truy cập nó với Reflection (nó sẽ là giá trị một shot mặc dù). Đặt cược tốt nhất của bạn là thêm phương thức ClearCache vào nguồn (vì nó là nguồn mở) và gửi nó để xem xét.

Có thể Sam Saffron hoặc Marc Gravell có thể xây dựng.


tôi không sử dụng Dapper, nhưng tôi nghĩ rằng phương pháp mở rộng sau đây nên làm việc với các phiên bản trong 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); 
    } 
} 

Nó chưa được thử nghiệm với Dapper nhưng tôi đã kiểm tra ra nguyên tắc sử dụng POCO. Việc truy cập vào API riêng tư là nguy hiểm (tốt nhất) nhưng phản ánh được sử dụng trong mẫu mã này sẽ hoạt động với phiên bản hiện tại.

+0

Đã cập nhật để bao gồm một phương pháp mở rộng sẽ hoạt động với phiên bản Dapper hiện tại. –

+0

Đã thêm phương thức tiện ích mở rộng để xóa bộ nhớ cache tham số và cố định cả hai phương thức này để hoạt động đúng với trường tĩnh (được bỏ qua lúc đầu). –

Các vấn đề liên quan