2013-03-02 2 views
4

사용자 정의 데이터를 UserProfile 테이블에 추가하는 것에 대해 BLOG을 읽은 후에 UserProfile 테이블에 기본 데이터를 저장하는 방법과 모든 추가 정보가 저장되는 다른 클래스를 변경하는 방법으로 변경하려고했습니다.SimpleMembership 사용자 지정

Interenet 응용 프로그램 템플릿을 사용하여 새 프로젝트를 생성 한 후, 나는 두 개의 클래스를 만들었습니다

Student.cs

[Table("Student")] 
public class Student 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public virtual int StudentId { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Surname { get; set; } 
    public virtual int UserId { get; set; } 
} 

UserProfile.cs

또한
[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
    public virtual int StudentId { get; set; } 
    public virtual Student Student { get; set; } 
} 

를, 내가 삭제 한 AccountModel.cs의 UserProfile 정의입니다. 내 DB 컨텍스트 클래스는 다음과 같습니다

MvcLoginDb.cs

public class MvcLoginDb : DbContext 
{ 
    public MvcLoginDb() 
     : base("DefaultConnection") 
    { 
    } 

    public DbSet<UserProfile> UserProfiles { get; set; } 
    public DbSet<Student> Students { get; set; } 
} 

AccountModel.cs에서 다시, 내가 삭제 한 DB 컨텍스트 정의

.

Enable-Migrations 

을 내 Configuration.cs은 다음과 같습니다 :

내부 패키지 - 관리자 - 콘솔은 내가 작성한 생성으로 학생 데이터를 추가하는 생각이었다

internal sealed class Configuration : DbMigrationsConfiguration<MvcLogin.Models.MvcLoginDb> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
    } 

    protected override void Seed(MvcLogin.Models.MvcLoginDb context) 
    { 
     WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 

     if (!WebSecurity.UserExists("banana")) 
      WebSecurity.CreateUserAndAccount(
       "banana", 
       "password", 
       new 
       { 
        Student = new Student { Name = "Asdf", Surname = "Ggjk" } 
       }); 

    } 
} 

새 클래스이지만이 방법은 실행 후 작동하지 않습니다. 업데이트 데이터베이스 - 자세한 내용 오류가 발생합니다. 아니요 m 개체 유형 MvcLogin.Models.Student에서 알려진 관리 공급자 네이티브 형식으로 apping이 존재합니다.

나는이 오류를 받고 있어요 왜

사람이 내가 다른 테이블에 추가 데이터를 저장하기위한 다른 방법을 사용 갈까요, expain 수 있습니까?

+1

새로운 [ASP.NET ID] (http://www.asp.net/visual-studio/overview/2013/creating-web-projects-in-visual-studio#indauth) 프레임 워크가 다시 작성된 것 같습니다. MVC 5의 경우 : 사용자 모델에서 추가 필드를 사용하여 문제를 해결 한 것처럼 보입니다. _ 새 멤버십 데이터베이스는 Entity Framework Code First에서 관리하며 모든 테이블은 수정할 수있는 엔터티 클래스로 표시됩니다. 즉, 데이터베이스 스키마와 프로필 관련 웹 UI를 자신의 필요에 맞게 쉽게 사용자 지정할 수 있으며 Code First Migrations를 사용하여 업데이트를 쉽게 배포 할 수 있습니다. _ – HenningJ

답변

3

같은 문제로 많은 어려움을 겪었습니다. 열쇠는 UserProfile 클래스와 Student 클래스 사이의 관계를 수정하는 것입니다. 올바른 일을하려면 일대일 관계 여야합니다. 여기

내 솔루션입니다 :

public class MyDbContext : DbContext 
{ 
    public DbSet<Person> Person { get; set; } 
    public DbSet<UserProfile> UserProfile { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
    modelBuilder.Entity<UserProfile>() 
        .HasRequired(u => u.Person) 
        .WithOptional(p => p.UserProfile) 
        .Map(m => m.MapKey("PersonId")); 
    } 
} 

그러나

Person.cs

public class Person 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    /* and more fields here */ 

    public virtual UserProfile UserProfile { get; set; } 
} 

UserProfile.cs

public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    public string UserName { get; set; } 

    public virtual Person Person { get; set; } 
} 

MyDbContext.cs, 또한 생성 고투 사용자 w WebSecurity.CreateUserAndAccount 메서드를 사용합니다. 그래서 난 내 사람이 엔티티 프레임 워크와 객체 다음 멤버 자격 공급자 방법으로 사용자 계정 생성 생성 결국 :

AccountRepository.cs

public Person CreatePerson(string name, string username) { 

    Person person = new Person { Name = name }; 
    _dbContext.Person.add(person); 
    _dbContext.SaveChanges(); 

    var membership = (SimpleMembershipProvider)Membership.Provider; 
    membership.CreateUserAndAccount(
     model.UserName, 
     createRandomPassword(), 
     new Dictionary<string, object>{ {"PersonId" , person.Id}} 
    ); 

} 
+0

솔루션을 이해합니다. 한편 NuGet에서 훌륭한 것을 발견했습니다. 이 접근법을 사용할 계획입니다. http://codefirstmembership.codeplex.com/ – Banana

+0

정말 흥미로운 프로젝트처럼 보입니다. 아마 나는 다음 프로젝트에서 그걸 줄 것이다. – HenningJ

0

HenningJ를, 나는 같은 일에 대한 대답을 찾고 있어요 .불행하게도 (당신이 알고 있다고 확신합니다.)이 방법으로 문제가 발생하면 SQL 트랜잭션이 없다는 것입니다. SaveChanges() 또는 CreateUserAndAccount()가 실패하여 사용자 데이터베이스가 유효하지 않은 상태가 될 수 있습니다. 실패하면 롤백해야합니다.

저는 아직 최종 답변을 찾고 있습니다 만, 제가 끝내는 해결책을 게시 할 것입니다. 커스텀 멤버십 제공자 (AGAIN!)를 써야하는 것을 피하기를 원하지만, 더 빠르다고 생각하기 시작했다.

관련 문제