2016-06-16 45 views
0

標準のMVC登録フォーム(つまり電子メールフィールド)から値を挿入しようとしています。これはプライマリキーと別のテーブルのFKです。学生テーブルにメールのみが含まれていますので、登録時に提出したのと同じ値(メールフィールド)をaspnetusersテーブルに挿入します。私はこれまでのところ、このコードを書かれている:aspnetuserに挿入して別のテーブルに値を挿入

var student = new Student { email = model.Email }; 

が値を代入して、

db.Students.Add(student); 
db.SaveChanges(); 

がアクションを実行するために、私はこれは登録コントローラで行われていると仮定します。私が間違ったセクションに置いたことを知らせてください。 student.emailがFKであれば、電子メールでなければなりません

AccountController.cs

public async Task<ActionResult> Register(RegisterViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
      var student = new Student { email = model.Email }; 
      var result = await UserManager.CreateAsync(user, model.Password); 
      if (result.Succeeded) 
      { 

       string callbackUrl = await SendEmailConfirmationTokenAsync(user.Id, "Confirm your account"); 


       ViewBag.Message = "Check your email and confirm your account, you must be confirmed " 
           + "before you can log in."; 
       db.Students.Add(student); 
       db.SaveChanges(); 
       return View("Info"); 

       //return RedirectToAction("Index", "Home"); 
      } 
      AddErrors(result); 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

Student.cs

public class Student 
{ 
    [Key, ForeignKey("User")] 
    public string email { get; set; } 
    public virtual ApplicationUser User { get; set; } 
} 
+1

私は 'あなたが表示されませんstudent.User = 'どこでも。 –

+0

[プライマリと外部キーの制約](https://msdn.microsoft.com/en-GB/library/ms179610.aspx)も参照してください。 – Liam

答えて

2

ここであなたの外部キーは暗黙のテーブルc olum User_Id(既定ではnullを指定できません)、値を取得するためにはUserの値を設定していません。代わりに電子メールを外部キーとして使用したいと思うようですが、それはどのように動作するかではありません。外部キーは、AspNetUsersIdの場合、Emailである関連テーブルの主キーを参照します。 のようにしても、それは非常に悪い考えです。 EmailはNVARCHAR(MAX)で、索引付けできません。

ロングとショート、クイックフィックスは、単にあなたの学生のインスタンスでUserを設定することです:

var student = new Student { email = model.Email, User = user }; 

しかし、ここで継承を実装するためにはるかに良いでしょう。生徒はユーザーなので、次のように設定します。

public class Student : ApplicationUser 

これはまったく必要ありません。 Studentを作成すると、ApplicationUserであるため、自動的に関連付けられます。ApplicationUser

UPDATE

継承する場合は、ちょうどあなたが再びEmailなどを追加する必要はありませんので、あなたは、ApplicationUser上のすべてのプロパティを継承していることを覚えておいてください。コンテキストからユーザーを引き出す場合は、たとえば、OfType<Student>を使用して、学生のみを取得することができます。デフォルト実装ApplicationUserManagerを使用すると、常にApplicationUserのインスタンスが返されます。それはUserManager<TUser>から継承しかし、あなたは、単に一般的なままにそのクラスを変更することができます。

public class ApplicationUserManager<TUser> : UserManager<TUser> 
    where TUser : ApplicationUser 

を既存のコードを変更することを避けるために、あなたにも、クラスの非ジェネリックバージョンを宣言することができます。

public class ApplicationUserManager : ApplicationUserManager<ApplicationUser> 
{ 
    public ApplicationUserManager(UserStore<ApplicationUser> store) 
     : base(store) 
    { 
    } 
} 

ApplicationUserManagerの異なるインスタンスを作成して、さまざまな種類のユーザーに対応できます。 ApplicationUserが基本タイプなので、すべてのユーザーがのユーザー(通常のログインの場合など)で使用する必要があります。

+0

クイックフィックスを試しましたが、動作しなかったため、エラーが発生しました。 1つまたは複数のエンティティ。詳細は、「EntityValidationErrors」プロパティを参照してください。それは私が パブリッククラスの学生を行った後、継承の方法あなたがより興味を持ってい db.SaveChanges();,達したとき:ApplicationUser を は、私が何かを変更する必要がありますか? – Newbie

+0

また、誰かが自分の電子メールに基づいて登録すると、彼らが学生か講師かを判断するので、なぜ私はそのアプローチを取っていたのですか。それは継承を進めることで可能ですか? – Newbie

+0

上記の更新を参照してください。 –

0

:私は現在

以下のコードを見てくださいを取得しています新しい学生を追加するためにdbに存在する

0

Student.csが正しくありません。 外部キーは、別のテーブルのPRIMARY KEYを指します。

あなたはこのようStudent.csを編集することができます。

public class Student 
{ 
    [Key] 
    public int StudentId { get; set; } 

    //Foreign key for User 
    [ForeignKey("User")] 
    public int UserId { get; set; } 
    public virtual ApplicationUser User { get; set; } 
} 

と電子メールがユーザーのテーブルの上にそれをチェック一意である場合、次のように登録すると:

public async Task<ActionResult> Register(RegisterViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
    var checkEMail = db.AspNetUsers.Where(a=>a.Email == model.Email).FirstOrDefault(); 
    if(checkEMail != null) 
     { 
      //Email is not valid 
     } 
    else 
    {    
      var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
      var student = new Student { email = model.Email }; 
      var result = await UserManager.CreateAsync(user, model.Password); 
      if (result.Succeeded) 
      { 

       string callbackUrl = await SendEmailConfirmationTokenAsync(user.Id, "Confirm your account"); 


       ViewBag.Message = "Check your email and confirm your account, you must be confirmed " 
           + "before you can log in."; 
       db.Students.Add(student); 
       db.SaveChanges(); 
       return View("Info"); 

       //return RedirectToAction("Index", "Home"); 
      } 
      AddErrors(result); 
     } 

} 
関連する問題