2012-03-22 1 views
1

私の質問は次のとおりです。C#コードでドメインテーブルのデータベースレジストリを参照するには?

データベースにはユーザーのルールを追加するドメインテーブルがあります。

このような何か:

テーブルUserRoles:

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

はい。私は多くの開発者がそれをやり遂げるのを見る。私は彼らの一人です。しかし、私はそれが安全ではないと思う。誰かがデータベースを変更でき、地図が間違ってしまうからです。しかし、私はこれを達成するための他の方法を見ていない。 –

+0

あなたはいつも何かにマップしなければなりません、それはIDかもしれません、それは説明か他の文字列フィールドかもしれません。動的システム(DB)に1つのデータがあり、静的システム(Code)に1つのデータがあるという事実には常に問題があります。フィールドを列挙型にキャストできるので、整数型フィールドへのマッピングはきちんとしています。 – Slugart

1

これを適切に実装する場合は、キーにロール名を含めます。そうすれば、誰かがキーが無意味だと思うIDの事故は起こり得ません。 idRuleという名前を付けることは役に立ちません。

第2に、ロール名の正しい使用を強制するチェック制約を追加します。

第3に、ロールの名前に一意のキー制約を追加して、各ロールが1回だけ発生するようにします。

必要に応じて、文字列列挙を使用してロール名から整数に変換できます。素晴らしいデザインパターンについては、C# String enumsを参照してください。

例表:

ID - NAME - DESCRIPTION - IS_ACTIVE
1 - CanEditClient - クライアント - 真
2 - CanDeleteClient - クライアント - 偽
3 - CanChangeClientName - クライアント - 真

次に、NAMEとCHECK制約に一意制約を追加してください。

誰かがIDをシャッフルしても、コードは引き続き動作します。

関連する問題