C#でデータレイヤーオブジェクトの「ステータス」にEnumを使用する
-
03-07-2019 - |
質問
次のような潜在的な状態のセットを持つデータオブジェクト(「エントリ」と呼びます)があります:
1 - Created 2 - File added 3 - Approved 4 - Invalid
これは、自動番号主キーを持つ「ステータス」テーブル、および適切な関係が設定されたメインテーブルの「ステータスID」フィールドでデータベースに表されます。
(カスタム)データレイヤーには、「エントリ」オブジェクトがあり、現在、上記の状態を指定したEnumを宣言しています。最後に、このEnumのプライベートインスタンスと適切なパブリックプロパティを宣言します。
「Commit()」メソッドで、Enumのインスタンスを整数にキャストし、Updateストアドプロシージャに渡します。
静的な 'GetEntry()'メソッドでは、明らかにデータベースから整数が返されます。次に、 'Enum.Parse()'メソッドを使用して、返されたステータス整数に対応するEnumのインスタンスであるオブジェクトを抽出します。これをEnumの型にキャストし、ローカルプライベート変数に割り当てます。
私の質問は非常に簡単です-このアプローチは適切ですか?そうでない場合は、生の整数値を保存する以外の選択肢はあります(必ずしも嫌いではありません)
私が尋ねる理由は、これはすべて、同じ値の2つのリストをキャストおよび維持することで、私にとって非常に厄介に見えることです。私は、データオブジェクトの利用者にとってより良い体験にあるという利点があることを認めますが、それでも...
ありがとう!
解決
私たちのプロジェクトの1つでなじみのあるものがあります。 アイテムのタイプを含むテーブルがあります。これらの型にはidがあります。コードには、同じidのenumがあります。 問題は、データベースでは自動番号(ID)を使用しないため、IDを完全に制御できることです。 オブジェクトを保存するときは、enumのIDを取得してオブジェクトを保存します。 また、このアプローチは面倒だと思いましたが、結局それほど悪くはありません。
他のヒント
この方法は私には問題ないようです。
過去にも同じことをしていましたが、enumの各メンバーの行を含むテーブルがあり、そのテーブルはenum値を使用したテーブルの外部キーでした。実際の列挙を見る必要なく、各ステータスが何であるかを理解できました。
たとえば、次のような列挙型がある場合
enum status
{
Active,
Deleted,
Inactive
}
次のレコードを持つstatusというテーブルがあります
ID  名前
0   アクティブ
1   削除
2   非アクティブ
そのテーブルは、その列挙を使用したテーブルの外部キーになります。
うん、これでいい!
このように値を常に明示的に設定してください。そうすれば、誰かが何かを追加しようとしても、価値が重要であり、混乱してはならないことに気付くでしょう。
enum status
{
Active = 1,
Deleted = 2,
Inactive = 3
}
WCF経由で値を渡す場合は、追加することをお勧めします
NULL = 0
それ以外の場合、データベースから取得した0をシリアル化しようとすると、恐ろしいエラーが発生し、デバッグに永遠に時間がかかります。
データベースルックアップテーブルが必要です。プログラムの列挙型は、コードに「マジックナンバー」が含まれないようにするのに便利です
コードでステータスを操作する必要がない場合、enumは不要です
このアプローチは常にEnumで行います。ステータスのような単純なアイテムであり、変更されることはないと思われる場合は、Enumを使用します。解析とキャストは、影響が非常に少ない操作です。
Linq to Sqlでこれを問題なく何年か正常に実行しています。 Linqは実際にEnumからintに自動的に変換し、自動的に戻します。
コードは速度だけでなく読みやすさ以上のものです。列挙型はコードを読み取り可能にします。
質問に直接答えるために、これは非常に有効なアプローチです。
コードで既知の「ステータス」の設定が必要な場合値(enumで定義した値)を使用する場合、これらの" Status"データベースに値が存在します。これらは存在している必要があるため、これらの各値に割り当てられたStatus_IDも制御する必要があります。
IDをドロップし、ルックアップ値IDを明示的に設定します。