Расширение MVC5 и Entity Framework 6 ApplicationUser, вызывающий недопустимую ошибку столбца при регистрации пользователя

asp.net-identity asp.net-mvc-5 c# entity-framework-6

Вопрос

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

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

Класс пользователя My Application

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

С конфигурацией Automapping

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 которое вызвало проблемы само по себе.

Принятый ответ

Решил. Проблема не имела ничего общего с тем, что было опубликовано в моем вопросе. Это закончилось тем, что я использовал инъекцию зависимостей, создав неправильный 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>>();    

Популярные ответы

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



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему