如何将应用程序用户放在与其他对象相同的上下文中?

时间:2013-10-28 06:07:58

标签: asp.net-mvc asp.net-mvc-5 asp.net-identity

股票asp.net mvc 5应用程序创建应用程序用户,即在单独的上下文中的身份用户,命名为名为“IdentityModels.cs”的文件 - 它看起来像这样

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
}

我正在尝试将Application用户放在常规数据上下文中,例如这样的

 public class BlogProphetContext : DbContext
    {

        public DbSet<ApplicationUser> ApplicationUsers { get; set; }
        public DbSet<Answer> Answers { get; set; }
        public DbSet<Question> Questions { get; set; }
        public DbSet<Tag> Tags { get; set; }
    }

但是,每次我这样做时,每次尝试创建帐户时都会出现以下错误

The UserId field is required

当我尝试执行以下代码行时,在AccountController.cs中

result = await UserManager.AddLoginAsync(user.Id, info.Login);

我觉得我的方法是错误的,并且我没有在没有某种外部诡计的主数据上下文文件中使用ApplicationUsers - 有没有人知道某种方法来做到这一点?所有文件都是最新的。

4 个答案:

答案 0 :(得分:11)

这有点太容易了 - 事实证明你只需要删除

<ApplicationUser> 

当你调用上下文时,一切都如你所料(即MVC假设和开发人员假设(在本例中为我的)同步。

这是正常工作

 public class MyContext : IdentityDbContext
    {
        public MyContext()
            : base("DefaultConnection")
        {
        }
        public DbSet<ApplicationUser> ApplicationUsers { get; set; }
        public DbSet<Answer> Answers { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        }
    }

答案 1 :(得分:3)

在这种情况下,如果您不希望ApplicationUser与asp.net Identity相关联,最简单的方法就是从applicationUser类中删除继承。

从ApplicationUser:IdentityUser转到ApplicationUser,然后在该类中创建一个Id属性。

然后你不必使用IdentityDBContext。

当然你必须完全重写AccountController,或者去掉它。你无法使用UserManager作为链接到IdentityUser的那个

然后,如果您正在使用EF,那么显然要确保添加迁移/更新数据库。

如果您确实希望保持帐户控制器不变并保留IdentityDbContext但添加其他实体,那么这很简单,只需执行以下操作:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext() : base("DefaultConnection")
    {
    }

    public DbSet<Dept> Dept{ get; set; }
    public DbSet<Course> Course{ get; set; }
    public DbSet<Etc> Etc{ get; set; }
}

答案 2 :(得分:2)

确保您的ApplicationUser类继承自IdentityUser。

然后,您需要配置上下文,以便正确映射所有ASP.NET Identity类。 这些是:

  1. ApplicationUser(您的班级)
  2. IdentityUserClaim
  3. IdentityUserLogin
  4. IdentityUserRole
  5. IdentityRole
  6. 此处的详细信息有点过于复杂,无法在此处发布,但我已经制作了一个与ASP.NET Identity的发行版一起使用的示例项目。你可以在这里看到它: https://github.com/onybo/Asp.Net-Identity-sample-app/tree/master/CustomUser

答案 3 :(得分:0)

我不确定这是否会对您有所帮助,或者我是否完全理解您的问题...但如果您想尝试使用自己的“模型”,请更改:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("PUT IN YOUR MODEL CONN HERE")
    {
    }

我不知道您可以配置多少,或者这是否真的会改变上下文。