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

[Primary and Foreign Key Constraints] (https://msdn.microsoft.com/en-GB/library/ms179610.aspx)도 참조하십시오. – Liam

답변

2

여기에 외래 키가 암시 적 테이블 c에 있습니다. olum User_Id이며 기본값으로 null이 허용되지 않으며 값을 얻으려면 User 값을 설정하지 않은 것입니다. 대신 전자 메일을 외래 키로 사용하려는 것 같지만 일이 어떻게 이루어지는지는 아닙니다. 외래 키는 AspNetUsers에 대해 Id, 이 아니고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

빠른 수정을 시도했지만 작동하지 않아 오류가 발생했습니다. 하나 이상의 개체. 자세한 내용은 'EntityValidationErrors'속성을 참조하십시오. 그것이 내가 공용 클래스 학생을 수행 한 후, 상속 방법 네가 더 관심 db.SaveChanges();에 도달 할 때 ApplicationUser 를 나는 무엇을 변경해야합니다? – Newbie

+0

또한 누군가가 자신의 이메일을 기반으로 등록 할 때 그들이 학생인지 강사인지를 결정할 때가되고 싶습니다. 왜 그런 접근 방식을 취하고 있었습니까? 상속으로 나아가는 것이 가능한가? – Newbie

+0

위 업데이트를 참조하십시오. –

0

, 다음 이메일을해야합니다 새로운 학생을 추가하기 위해 db에 존재합니다.

0

Student.cs가 올바르지 않은 사용자를 사용해야합니다. 외래 키가 다른 테이블의 PRIMARY KEY를 가리 킵니다.

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; } 
} 

를 이메일은 고유 한 경우 다음과 같이 등록 할 때 사용자 테이블에 그것을 확인 :

이 같은 Student.cs을 편집 할 수 있습니다

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); 
     } 

} 
관련 문제