如何使用IdentityDbContext

时间:2018-03-12 09:21:54

标签: c# asp.net-core entity-framework-core

在过去的几天里,我一直在玩Asp.net的Identity框架。

我已经能够使注册和登录工作,但是当我尝试将功能扩展到针对特定用户保存数据时,我发现它与我通常使用库存标准EF实现它的方式不同。

通常我会使用类似下面的内容来保存数据:

using(var context = myDbContex())
{
   context.Add(object);
   context.SaveChanges();
}

然而,当我在继承IdentityDbContext后尝试使用这种方法时,它期待一个参数。我可以创建一个不接受任何参数的默认构造函数,或者我应该传递一些内容吗?

我的上下文目前看起来像这样:

public class AppContext : IdentityDbContext<ApplicationUser>
    {
        //I am not really sure why options needs to be specified as an argument   
        public AppContext(DbContextOptions<AppContext> options)
            : base(options)
        {
        }

        public DbSet<ApplicationUser> ApplicationUsers { get; set; }

        public DbSet<Xxxxx> Xxxxx { get; set; }

        public DbSet<Yyyyy> Yyyyy { get; set; }

        public DbSet<Zzzzz> Zzzzz { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
        }
    }

在Startup.cs

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<AppContext>(options =>
                                                        options.UseSqlite("Data Source=App.db"));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<AppContext>()
            .AddDefaultTokenProviders();
        });

为什么上下文的实现与标准dbContext不同,如何使用此上下文保存数据?

由于

1 个答案:

答案 0 :(得分:2)

因为这行

services.AddDbContext<AppContext>(options => options.UseSqlite("DataSource=App.db"));

您需要提供一个将DbContextOptions作为参数的构造函数,它与IdentityDbContext没有任何关系。

你现在有两个选择。

使用依赖注入,这就是你应该如何使用它

public class MyController : Controller
{
   private AppContext context;

   public MyController(AppContext context)
   {
      this.context = context;
   }
}

其次,您可以以不同方式注册您的上下文。

services.AddDbContext<AppContext>();

在您的上下文中应用更改,删除构造函数并覆盖OnConfiguring(DbContextOptionsBuilder optionsBuilder)

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
   optionsBuilder.UseSqlite("Data Source=App.db");
}

现在你可以像往常一样使用它。

using(var context = new AppContext())
{
   // do stuff
}

修改

不是实际问题的一部分,但是注册,注册和角色管理由这些类处理,可以在使用IdentityDbContext时注入