我正在尝试扩展 ApplicationUser 类,以便我可以包含 UserProfile信息在单独的表中。 但是我无法让它工作并且正在得到当我在帐户控制器中调用 UserManager.CreateAsync
方法时出现异常。
列名称"用户配置文件 ID"无效。
我的应用程序用户类
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
的字段,该字段本身会导致问题。
解决了。 问题与我的问题中发布的任何内容无关。 最终是因为我使用了依赖注入,导致错误的DBContext被创建并插入到帐户控制器中。
似乎正在发生的事情是因为我没有在我的 AutoFaq 设置中映射 DbContext,用于创建 UserStore 的构造函数是它的默认值。 在这种情况下,这似乎意味着创建一个 IdentityContext 而不是我的应用程序 DataContext 类。 但是,此上下文没有新的用户配置文件属性,因此它在用户配置文件ID上出错。
我通过向我的 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>>();
只是另一种拯救那些像我一样有正确构造函数被击中的人的可能性。我有一种方法可以在我的初创公司注册的数据库中创建种子数据.cs(核心 2)这是查询我试图扩展的表并导致相同的错误。当我找到它时,我想是有道理的。在我运行添加迁移时注释掉这些行足以让我解决这个问题。
谢谢,接受的答案对我有帮助。对于任何使用 Ninject 的人来说,这是我最终得到的代码
Bind<IUserStore<ApplicationUser>>().ToMethod(
ctx =>
{
var dbContext = ApplicationDbContext.Create();
return new UserStore<ApplicationUser>(dbContext);
}
);
Bind<UserManager<ApplicationUser>>().ToSelf();