2010-05-23 44 views
2

我的實踐表明,一般的企業應用程序有很多實體,其性質與基本枚舉相對應。例如,我們可能有一個Order實體,它可能具有諸如「OrderType」,「OrderStatus」,「Currency」等字段,引用相應的實體,它們只不過是綁定到要引用的鍵的文本名稱。你在你的數據應用中使用枚舉嗎?

使用枚舉在這裏看起來很自然。但實體必須在設計時在應用程序代碼中定義,對嗎?雖然我們需要能夠在運行時CRUD枚舉值變體,並在服務器端SQL查詢(如存儲過程和視圖)中使用枚舉。

你在這個問題上的做法和想法是什麼?

我特別感興趣的是C#4,linq和T-SQL。

回答

1

從某種意義上說,C#枚舉類似於面向對象的類層次結構。如果您聲明枚舉Choice與替代品OneTwo,它有點類似於聲明具有基類Choice和兩個派生類型(One : ChoiceTwo : Choice)的類層次結構。

  • 一個區別是,枚舉不是可擴展的(如果你需要添加的情況下,你需要修改的聲明,而如果你需要的情況下添加到一個類層次結構,只需定義一個新的繼承類型)。

  • 第二個區別是枚舉的選項不能攜帶附加數據 - 如果您聲明瞭類層次結構,則可以將其他字段存儲在One大小寫中(例如)。

如果沒有這兩個「limiations」,你可以考慮使用枚舉來表示應用程序中的實體(實際上,函數式語言具有構造類似於這些「更強大」枚舉和使用它的這幾樣東西) 。

但是,由於C#枚舉是非常簡單的,他們大多是用於表示值獨立於特定域的,或者需要更多的一般的編程值。例如:

enum TriState { True, False, Undecided } 

這可能是相當有用的類型,但它與任何特定域都沒有直接關係。

2

我使用的數據庫值的枚舉不應該由用戶創建或更改,並且如果存在基於該值的特殊邏輯。貨幣不是一個很好的例子,除非您的枚舉中包含所有貨幣,並且接受在新貨幣出現或不推薦使用時您必須重新編譯您的應用程序。如果基於OrderStatus的系統中有邏輯,OrderStatus可能是一個很好的例子。無論如何,應該注意的是,如果您確實創建了一個枚舉來表示數據庫值,那麼應該重新編譯應用程序,如果需要創建此表中的新值,則應謹慎使用此實踐。

在我要去模仿數據庫值與枚舉的情況下,我用枚舉值的名稱作爲表的主鍵,它被傳遞到外鍵值。也就是說,當我保存到數據庫時,我將通過myEnumVal.ToString()。我有幾個原因。首先,它要求增加一個值更加慎重。如果我使用數字值作爲主鍵,則暗示我正在使用代理鍵,並且可以輕鬆地添加其他值。當其他開發人員看到使用名稱作爲主鍵的列時,他們更有可能認爲該值不是任意的。其次,它使數據庫代碼更易於閱讀。您會收到諸如Where OrderStatus = 'Active'而不是Where OrderStatus = 1的查詢。