2012-03-22 41 views
1

我的問題是:如何在C#代碼中引用域表的數據庫註冊表?

我在數據庫中有一個域表,其中我爲用戶添加了一些規則。

事情是這樣的:

表的UserRole:

idRule cRuleDescription bRuleIsActive 
1 Edit client  true 
2 Delete client false 

我的C#應用​​程序引用此表的使用枚舉,像這樣:

public enum UserRoles: int 
{ 
    CanEditClient = 1, 
    CanDeleteClient = 2, 
    CanChangeClientName = 3, 

    //More code 
} 

我使用查詢C#方法數據庫通過它的Id來知道登錄的用戶是否有權執行某些操作。像這樣的:

bool HasPermissionToEdit = Rules.UserHasPermisson(UserName, UserRoles.CanEditClient) 

if(HasPermissionToEdit) 
{ 
    //Do the work! 
} 

但是使用這會給我一些麻煩。有人在數據庫的製作過程中創建了新的行。而且這些ID不再正確。我需要更改我的C#代碼中的枚舉。我需要使用此表,因爲管理用戶可以管理其他用戶組的規則。

你如何使用它?有一種更好的方式來引用表上的註冊表?

回答

0

只要規則ID不是自動生成的(即不是自動生成的列),使用規則ID映射到枚舉本身並不瘋狂。

+0

是的。我看到很多開發人員都這麼做。我是他們中的一員。但我認爲這不安全。因爲有人可以更改數據庫,並且地圖會出錯。但我沒有看到其他方式來實現這一點。 – 2012-03-22 19:05:58

+0

您將始終需要映射到某個內容,它可能是它可能是描述的ID或另一個字符串字段。在動態系統(DB)中有一塊數據,而在靜態系統(代碼)中有一塊數據的情況下,您總會遇到問題。映射到整數字段很整潔,因爲您可以將該字段投射到您的枚舉。 – Slugart 2012-03-22 19:08:42

1

如果您想正確實施此操作,請使該鍵包含角色的名稱。這樣一來,身份證就不會有人認爲鑰匙毫無意義的事故。命名它idRule沒有幫助。

其次,添加一個檢查約束來強制正確使用角色名稱。

第三,在角色的名稱上添加一個唯一的鍵約束,以強制每個角色只出現一次。

如果需要,可以使用字符串枚舉將角色名稱轉換爲整數。看到C# String enums一個不錯的設計模式。

實施例的表:

ID - 名稱 - 說明 - IS_ACTIVE
1 - CanEditClient - 客戶端 - 真
2 - CanDeleteClient - 客戶端 - 假
3 - CanChangeClientName - 客戶端 - 真

然後確保爲NAME和檢查約束添加一個唯一約束。

現在,無論如何有人洗牌的ID,你的代碼將繼續工作。