在过去的几天里,我一直在玩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不同,如何使用此上下文保存数据?
由于
答案 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时注入