2016-05-03 4 views
1

私はASP.NET IDを使用するASP.NET MVCアプリケーションを持っています。サブタイプ固有のフィールドを持つAspNet Identity ApplicationUser

  • 学生
  • 著者
  • 管理

学生の役割は、フィールドのX数を持つことができるので、これら3つのプロファイルは、永続化するために様々な分野を持っている、著者の役割:私は自分のアプリケーションのための3つの役割を持っています、Y個のフィールドとAdminロール、Z個のフィールド、お互いに無関係です。問題は、私がエレガントなデザインを作る方法を考えることができないということです。ここで

は、私がこれまでにかかわら/しようとしたものです:、ている、(各ロール用)の3つの異なるクラスを作成するので、基本的に、私は学生、著者および管理テーブルを持っているつもりだがしかし

まずI ApplicationUserテーブルとの1:1の関係ですが、これはまったくクリーンなソリューションではありません。

これは私が現時点で実装したものです。私はこれらの3つの役割のすべての共通フィールドを保持するApplicationUserクラス(テーブル)を持っています。 それぞれについて、私はApplicationUser(基本クラス(テーブル)として機能する)と1対1の関係を持つクラス(テーブル)を作成しました。

私が思い描いたもう一つの解決策は、 PartitionKeyには、ApplicationUser.IdとRowKeyのRoleIdが必要なので、各エンティティを簡単にCRUDすることができます。これは役に立ちますが、このアプローチは2つの異なるデータソースを維持することにつながりますが、これは私が探しているものではありません。

このためのクリーンなデザインに関する提案はありますか?

UPDATE

研究から、私はモデルの継承/スーパータイプサブタイプの関連付けは、おそらく行くには良い方法であることを取得します。特に、1つのテーブルの実装では、パフォーマンスも良いようです。たとえば :

  • は学生、著者および管理者のためのすべてのフィールド(共通およびサブタイプ特異的)
  • 3追加のビューが含まれているApplicationUserテーブルを作成します。

は、サブタイプ固有のフィールドのための多くのnull値につながるが、良い回避策のように思えるんでした。他の提案はありますか?

+0

学生は著者、著者、管理者、または管理者の学生になることができますか? – Erresen

+0

@Erresen学生は昇格した特権を持つことはありません。作成者は管理者の役割にアップグレードできます。管理者は管理者のままです。したがって、本質的に、作成者だけが管理者になることができます(管理者が管理者を追加する場合)。 – gdyrrahitis

+0

学生、著者、および管理者のフィールド(またはその3つのうちのいずれか2つのフィールド)の間に共通点はありますか?そうでなければ、私は3つの別々のテーブルを使用します(そうしないと、作成者を管理者にアップグレードしてから後でダウングレードするとデータが失われる可能性があります)。共通性がある場合は、これらのフィールドをApplicationUserまたは別の「ベース」テーブルに配置し、クラス固有のフィールドの追加テーブルを作成します。 – technophile

答えて

2

あなたのアプローチはかなり良いと思います。代わりにasp.netアイデンティティのUserClaimsのようなアプローチを使用することができます。

あなたは役割ごとに特定のフィールドを持っている必要がありますが、あなたは
  • 属性の

    • ユーザーのFK
    • 属性のデータ型を保存しようとしている4列を持つテーブルはありません。このアプローチでは

      名前

    • 属性の値

    --------------------------------- 
    | FK | Type | Name | Value | 
    --------------------------------- 
    | 1 | string | name | John Doe | 
    --------------------------------- 
    | 1 | int | age | 30 | 
    --------------------------------- 
    

    以下に、コントローラのアクションがパラメータとして受け入れることができる例を示します(名前と年齢が学生にのみ必要なフィールドであると仮定しています)。

    { 
        id:1, 
        updatedOn : '2016-01-01 00:01', 
        role:'Student', 
        extraFields : { 
            name:'John Doe', 
            age : 30} 
    } 
    
  • 関連する問題