2014-01-03 3 views
3

Я пытаюсь расширить класс ApplicationUser, чтобы я мог содержать информацию UserProfile в отдельной таблице. Однако мне не удается заставить это работать, и я получаю исключение, когда я вызываю метод UserManager.CreateAsync в своем AccountController.Расширение MVC5 и Entity Framework 6 ApplicationUser, вызывающий недопустимую ошибку столбца при регистрации пользователя

Недопустимое имя столбца 'UserProfileId'.

Мой класс Application User

public class ApplicationUser : IdentityUser 
{ 
    [ForeignKey("UserProfileId")] 
    public virtual UserProfile UserProfile { get; set; } 
    public int UserProfileId { get; set; } 
} 

Мой профиль класса

public class UserProfile 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [Required, MaxLength(200)] 
    public string EmailAddress { get; set; } 

    [Required, MaxLength(50)] 
    public string FirstName { get; set; } 

    [Required, MaxLength(50)] 
    public string LastName { get; set; } 
} 

Мой первый объект сгенерированный код миграции

CreateTable(
    "dbo.AspNetUsers", 
    c => new 
     { 
      Id = c.String(nullable: false, maxLength: 128), 
      UserName = c.String(), 
      PasswordHash = c.String(), 
      SecurityStamp = c.String(), 
      UserProfileId = c.Int(), 
      Discriminator = c.String(nullable: false, maxLength: 128), 
     }) 
    .PrimaryKey(t => t.Id) 
    .ForeignKey("dbo.UserProfile", t => t.UserProfileId, cascadeDelete: true) 
    .Index(t => t.UserProfileId); 

Мой код для создания нового пользователя Регистрация

var user = Mapper.Map<ApplicationUser>(model); 
var result = await UserManager.CreateAsync(user, model.Password); 

С Автоотображением конфигом

Mapper.CreateMap<RegisterViewModel, ApplicationUser>() 
    .ForMember(dest => dest.UserProfile, opt => opt.MapFrom(v => Mapper.Map<RegisterViewModel, Data.Model.UserProfile>(v))); 

Mapper.CreateMap<RegisterViewModel, Data.Model.UserProfile>() 
    .ForMember(dest => dest.FirstName, opt => opt.MapFrom(v => v.FirstName)) 
    .ForMember(dest => dest.LastName, opt => opt.MapFrom(v => v.LastName)) 
    .ForMember(dest => dest.EmailAddress, opt => opt.MapFrom(v => v.EmailAddress)); 

ПРИМЕЧАНИЯ: Я попытался удалить int UserProfileId и это вместо того, чтобы создало поле, называемое UserProfile_Id, который вызвал проблемы и сам по себе.

ответ

3

Решено. Проблема не имела ничего общего с тем, что было опубликовано в моем вопросе. Это закончилось тем, что я использовал инъекцию зависимостей, создав неправильный DBC-текст и вставляемый в AccountController.

Что, по-видимому, происходит потому, что у меня не было DbContext, отображаемого в моей настройке AutoFaq, конструктор, используемый для создания UserStore, был по умолчанию. И в этом случае, похоже, это означает создание IdentityContext, а не моего класса DataContext. Однако этот контекст не обладал новым свойством UserProfile, поэтому он был ошибочным в UserProfileId.

Я исправил это, добавив в конструкцию AutoFaq специальный конструктор.

 builder.RegisterType<Data.Model.DataContext>() 
      .As<IDataContext>() 
      .InstancePerHttpRequest(); 

     // Added this here to ensure the context passed in is my DataContext 
     builder.RegisterType<UserStore<ApplicationUser>>() 
       .As<IUserStore<ApplicationUser>>() 
       .WithParameter((pi, ctx) => { return pi.Name == "context"; }, 
           (pi, ctx) => { return ctx.Resolve<IDataContext>(); } 
         ); 

     builder.RegisterType<UserManager<ApplicationUser>>().As<UserManager<ApplicationUser>>();  
+0

У меня была та же проблема. Спасибо, что поделились своим решением! – mac10688

+0

@ mac10688 без проблем. Мне потребовалось некоторое время, чтобы понять, что один из них. – dreza

1

Спасибо, принятый ответ мне помог. Для тех, кто с помощью Ninject, это код, который я закончил с

Bind<IUserStore<ApplicationUser>>().ToMethod(
    ctx => 
    { 
    var dbContext = ApplicationDbContext.Create(); 
    return new UserStore<ApplicationUser>(dbContext); 
    } 
); 

Bind<UserManager<ApplicationUser>>().ToSelf(); 
+0

Спасибо за обмен – dreza

1

Просто другой возможности спасти тех, кто, как я был правильный конструктор удара. У меня был метод для создания данных семени в базе данных, зарегистрированной в моем startup.cs (Core 2), это запрос к таблице, которую я пытался расширить, и вызвал ту же ошибку. Сделал смысл, когда я нашел его, я думаю. Комментировать строки, пока я запускал add-migration, было достаточно, чтобы решить проблему.