2009-03-03 135 views
2

我有一個數據對象的數據層對象的「狀態」(讓我們說這就是所謂的「入門」),有一組是這個樣子的潛在狀態:使用枚舉在C#中

1 - Created 
2 - File added 
3 - Approved 
4 - Invalid

這在數據庫中用一個帶有自動編號主鍵的'狀態'表來表示,然後在主表中設置一個'狀態標識'字段,並建立適當的關係。

在我的(自定義)數據層中,我有'Entry'對象,並且當前還聲明瞭一個Enum,其中列出了上面列出的狀態。最後,我宣佈這個Enum的私有實例以及相應的公共屬性。

在我的'Commit()'方法中,我將Enum的實例轉換爲一個整數並將其傳遞給Update存儲過程。

在我的靜態'GetEntry()'方法中,我顯然會從數據庫傳回一個整數。然後,我使用'Enum.Parse()'方法來提取一個對象,該對象是我的Enum的一個實例,它與返回的狀態整數相對應。我把它轉換成我的枚舉類型,並將其分配給本地私有變量。

我的問題很簡單 - 這種方法是否合適,如果不是什麼替代方案,除了存儲原始整數值(我不一定反感),更好。

我的要求是,這一切似乎令人難以置信的混亂對我來說,什麼與所有鑄造和維護同一組值的兩個列表。我接受的好處在於爲數據對象的消費者提供更好的體驗,但即使如此...

謝謝!

回答

3

我們對我們的一個項目有些熟悉。 我們有一個包含項目類型的表格。這些類型有一個ID,在代碼中我們有一個枚舉ID相同的枚舉。 問題是,在數據庫中我們不使用自動編號(標識),所以我們完全控制了編號。 當保存我們的對象時,我們只需要枚舉的id來保存對象。 我也認爲這種方法很混亂,但並沒有那麼糟糕。

1

該方法對我來說似乎很好。

在過去,我做了同樣的事情,但也有一個表,其中包含一個枚舉的每個成員的行,那麼表就是任何使用枚舉值的表的外鍵,只是有人閱讀數據庫可以理解每個狀態是什麼,而無需查看實際的枚舉。

例如,如果我有一個像

enum status 
{ 
    Active, 
    Deleted, 
    Inactive 
} 

枚舉我將有一個表叫做狀態,將有如下記錄

ID    名稱
   活動
   刪除
   不活動

該表將成爲使用該枚舉的任何表的外鍵。

+0

「這是在數據庫中用'自動編號主鍵'的'狀態'表格表示的;-) – 2009-03-03 15:00:57

+0

是的,這不起作用,因爲默認情況下枚舉從0開始編號。祝你好運固定的狀態:) – leppie 2009-03-03 15:08:52

+0

我的壞,修正:) – Gavin 2009-03-03 15:10:57

0

數據庫查找表是必要的;該程序枚舉方便,避免在代碼中有「幻數」

,如果你的代碼並不需要操作的狀態,不過,那麼枚舉是不必要的

0

我做到這一點的辦法與枚舉所有的時間。如果它是一個簡單的項目,如狀態,預計不會改變我寧願Enum。解析和投射是一個影響非常小的操作。

我一直在成功地使用Linq to Sql一段時間沒有問題。 Linq實際上將從Enum轉換爲int並自動返回。

代碼不僅僅是速度而是可讀性。枚舉使代碼可讀。

要直接回答你的問題,這是一個非常有效的apporach。

0

如果您的代碼需要設置已知的「狀態」值(您在枚舉中定義的值),那麼可能還需要這些「狀態」值存在於數據庫中。由於它們必須存在,您還應該可以控制分配給每個值的Status_ID。

刪除標識並明確設置查找值標識。

1

是的,這很好!

請始終明確地設置像這樣的值。這樣,如果有人曾經添加過一些東西,他們會意識到這些價值觀很重要,不應該混淆。

enum status 
{ 
    Active = 1, 
    Deleted = 2, 
    Inactive = 3 
} 

如果您是通過WCF各地傳遞的價值,我建議增加

NULL = 0 

否則,如果你嘗試序列0來自數據庫,你會得到一個可怕的錯誤,它會帶你永遠調試。