2011-06-21 14 views
5

スーパー管理者だけが「ライブ」データを変更できるという要件があります。Entity Frameworkを使用したライブデータへの変更の承認

現在、通常の管理者は、データが生きるために変更したいと考えている場合: -

  1. スーパー管理者は、通常の管理者がその変更を行う
  2. データをパブリッシュを解除し
  3. スーパー管理者が承認します変更を行い、データを公開する

スーパーユーザーが変更を承認するまで、ステップ1を削除して古いデータを残しておきたい場合はどうすればよいですか?

私はASP.NET MVCとEF4を使用していますので、特に私のコントローラに透過的にできるEFのソリューションに興味がありますが、データベースレイヤのソリューションについても聞きたいです

+0

データベース設計に関する情報を提供して、どのフィールドと関係が正確に公開され、承認が必要なのでしょうか? –

+0

私は、スキーマ固有のソリューションではなく、汎用ソリューションを探しています。あるソリューションが他のエンティティではなく一部のエンティティで機能する特別な理由はありますか? –

+0

EFは、生成されたコードをカスタマイズし、保存する前に変更を検証する方法を提供します。しかし、あなたの承認などのロジックはビジネスロジックであり、EFは単なるデータアクセスレイヤーです。また、管理者が未承認の変更を視覚化する方法も、ビジネスロジックの一部です。単一項目は問題ではありませんが、オブジェクト階層は一般化するのが複雑です。 –

答えて

5

まず、役割ベースのアクティビティについて話しているので、アプリケーション/ビジネス層に関係しない適切なソリューションを見つけるのは難しいです。あなたのデータアクセス層は、スーパー管理者または普通の管理者がそのメソッドを呼び出すという事実を知らないはずです。

いずれにしても、これを処理する1つの方法は、PendingChangesテーブルを作成し、通常の管理者の変更を保留中であることを示すフラグとともに保存することです。その後、スーパー管理者が承認したら、レコードをPendingChangesからライブテーブルにコピーします。

+0

私は文言を編集しました。理想的には、私はこの問題をコントローラから取り除きたいと思っています。コンテキストオブジェクトやサービス層でそれを処理してください。 –

1

単純なオブジェクトグラフの例を挙げようとします。

以下の構造のブログを考えてみましょう。

Posts 
    PostID 
    Title 
    Description 

PostUpdates 
    PostUpdateID 
    PostID 
    Title 
    Description 
    DateUpdated 
    UpdatedBy 
    ApprovedBy 
    PostStatus(Approved/Rejected) 

ここで私のロジックは投稿を表示することになり、最終更新と承認後の更新が行われます。この場合、実際には何も変更されません。常に新しいセットの変更が追加され、古いバージョンを削除することができます。

保存する場合は、PostUpdatesに新しいPostUpdateエントリを追加します。

スーパー管理者は、すべての更新を表示して、正しいものを承認することができます。管理者がアップデートの承認を決定すると、Postは最後に承認されたPostUpdateの内容で修正されます。

別の代替(より一般的な)

あなたは、従うよう

RowUpdates 
    RowUpdateID 
    TableName 
    TableKey 
    NewValues (kind of XML store to save which fields were modified) 
    UpdatedBy 
    ApprovedBy 
    DateUpdated 
    UpdateStatus (Approved/Rejected) 

をテーブルを作成することができますが、この場合には、あなたはDBに値を保存しないようするためにリフレクションを使用して、代わりに新しいRowUpdateを作成する必要があります管理者が承認した場合にのみ、リフレクションマッピングを実行した後で実際の値をdbに通知する必要があります。

関連する問題