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.
Nguồn
2012-03-08 02:57:45
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. –
@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. –
@ M.Babcock Tôi chưa thử nghiệm nó, nhưng có vẻ như nó sẽ giúp –