2017-04-07 16 views
0

私はIDを使用して作成される認証と承認が必要なMVCプロジェクトに取り組んでいます。また、プロジェクトデータベースにはシステムを使用する主体が含まれていますその状況に対処する練習。独自のデータベースとmvc5 IDの統合と統合

  1. アイデンティティApplicationUserを自分の要件にカスタマイズする必要があります。
  2. 自分のテーブル(モデル)を作成し、IDテーブルと統合してください。その方法はわかりません。 または他のソリューション。
+0

最初の解決策はもっと明らかです –

+0

私はどのように異なるエンティティでそれを行うことができ、異なる要件は、学生とインストラクター、学生は給料を持っていないが、インストラクターが持っていると言う。ベストプラクティスは何ですか?ありがとうございます –

+0

継承を使用することができます - https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/inheritance –

答えて

1

Identityエンティティをカスタマイズする必要があります。そのため、Identity:を作成する理由は、拡張性を高めるためです。異なるタイプの「ユーザー」を持つには、ApplicationUserから継承する必要があります。重要なのは、ではなく、からIdentityUserまでです。これにより、アイデンティティの基本的な関係(ロール、クレーム、ログインなど)はすべて1つの「ユーザー」表に結び付けられますが、その表を拡張するか、追加のユーザー・データを保持するための他の表を作成できます。デフォルトで

public class ApplicationUser : IdentityUser 

public class Student : ApplicationUser 

public class Instructor : ApplicationUser 

、この継承はまた、STI(単一テーブル継承)として知られ、TPH(階層毎の表)によって実装されるであろう。つまり、すべての派生クラスのすべてのプロパティは、単一のデータベーステーブルの列で表されます。 Discriminator列も追加され、保存された実際のクラスの名前(「ApplicationUser」、「Student」、「Instructor」)が保持されます。 EFは、クエリーからオブジェクトグラフを構築するときにこの列を使用して、正しい「ユーザー」タイプをインスタンス化します。

このアプローチの長所と短所があります。すべてが単一のテーブルに存在するため、クエリは簡単で迅速です。ただし、この方法では、派生クラスごとのすべてのプロパティをデータベースレベルでNULL可能なにする必要があります。明らかな理由は、Instructorに必要な列がある場合、Studentにはその要件を満たすプロパティがないため、Studentを保存できないためです。ビュー・モデルを使用して、ビュー・レベルでプロパティーを必要とするように強制することもできます。ただし、データベースの実際の列はNULL可能でなければなりません。

代替アプローチは、TPT(Table Per Type)と呼ばれるものを使用することです。この継承ストラテジでは、すべての共通プロパティを持つ基本クラス(ApplicationUser)のテーブルが作成されます。次に、discreet派生クラスごとにそのクラスに存在するプロパティだけを持つテーブルが作成されます。外部キーがベースクラスのテーブルに追加されます。この外部キーは、そのテーブルの共通データを派生クラスのテーブルの特定のデータに結合するために使用されます。このアプローチでは、データベースレベルでNOT NULLを強制することができますが、もちろんすべてのデータを取り込むためには結合が必要となり、クエリが遅くなる可能性があります。 TPTを実装するために

、あなたの派生クラスに[Table]注釈を追加するだけで必要があります。ノートの

[Table("Students")] 
public class Student : ApplicationUser 

[Table("Instructors")] 
public class Instructor : ApplicationUser 

最後にもう一つの事はあなたがUserManagerを利用する必要があります方法です。 AccountControllerをスキャフォールドした場合、コントローラのプロパティはUserManagerに設定されていることがわかります。このプロパティはユーザの作成、ユーザの参照、パスワードの変更などに利用されます。これは一般的なタイプのため、実際はUserManager<ApplicationUser>のインスタンスです。StudentまたはInstructorを具体的に使用する必要がある場合は、UserManager<Student>UserManager<Instructor>をそれぞれインスタンス化する必要があります。 UserManager<ApplicationUser>のインスタンスを使用することはできません。派生型をApplicationUserにアップキャストします。例:

var student = new Student { ... }; 
await UserManager.CreateAsync(student); 

実際にApplicationUserがデータベースに保存されます。学生固有のデータは破棄され、Discriminator列の値は "ApplicationUser"になります。

+0

ありがとう、もう一度お試しください! –