2009-08-29 104 views
2

我是ASP.NET新手,有WinForms和WPF經驗。在我身上輕鬆一下。有沒有從數據庫中存儲枚舉的好方法?

當我的頁面加載時,它會觸碰數據庫並查詢表格以便將其放入下拉列表中。現在,如果您在頁面上進行回發,您是否重新加載了form_load中的值?看起來沒有必要打兩次數據庫。我的假設是我把form_load,我打到數據庫的枚舉,然後用我找到的值填充下拉列表。

回答

1

我假設你正在談論一個「查找表」,基本上有一個架構爲{Id,Name}並被作爲另一個表中的外鍵引用的東西,是正確的嗎?

這是一個古老的問題,沒有「正確的」答案。

如果您的枚舉可能完全改變(可能由管理員用戶控制),您將無法使用@Andrei Rinea的建議,因爲您需要刷新數據庫中的值。最終,凱爾特克斯建議您最好不要做這樣的事情,並在短時間內緩存結果 - 可能只需5分鐘。如果您的負載很重,那麼少量緩存可能會提高性能。

如果您的枚舉不太可能改變......特別是如果它不能通過管理員的UI修改,那麼我喜歡做一個有趣的技巧,即將枚舉映射到實際的C#枚舉, enum的值直接與枚舉表的主鍵相關聯。通過這種方式,您根本不必訪問數據庫以獲取可能的值列表。

這個技巧的缺點是新的枚舉項目需要新的編譯代碼和新的部署。這可能是也可能不是理想的,所以謹慎使用這個技巧。

1

這些可以在Application對象的應用程序啓動時加載。我想他們不會經常改變。

然後從那裏使用。對於這樣的「目錄」很少改變(每年或更少),我經常將它們硬編碼爲枚舉類型。

編輯:

對於枚舉如PaymentStatus或這樣,其改變很少或從未映射到具有相同的數值的目錄中的C#枚舉,如Randolpho所述是確定。對於其他人緩存HttpRuntimeCache對象(「緩存」)並放置絕對到期或者SqlDependency

+0

似乎不太可靠。如果我的應用程序運行很長時間,並且枚舉的更改頻率比這更頻繁? – MedicineMan 2009-08-29 21:50:16

+0

對於諸如PaymentStatus之類的枚舉,很少或永遠不會改變映射到具有相同數值的目錄的c#枚舉,因爲Randolpho說沒關係。對於其他人在HttpRuntimeCache對象(「Cache」)中緩存,並將絕對到期或SqlDependency – 2009-08-30 11:06:57

2

您可以使用Page.IsPostBack屬性控制回發過程中調用的內容。它返回一個布爾值,指示頁面在回發中的時間。例如:


public partial class _Default : System.Web.UI.Page { 
    protected void Page_Load(object sender, EventArgs e) { 
     if (!this.IsPostBack) { 
      // fill the enums 
     } 
    } 
} 

2

使用Cache對象並將數據庫結果存儲在緩存中。

相關問題