asp.net - Asp.Net Core:向 IdentityDbContext 添加数据或使用 DbContext
问题描述
我使用Asp.Net Core WebApi项目。
我可以将我的表添加到IdentityDbContext,如下所示:
public class ApplicationDbContext : IdentityDbContext<User>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{ }
public DbSet<ProgrammerRole> ProgrammerRoles { get; set; }
public DbSet<Project> Projects { get; set; }
public DbSet<SubProject> SubProjects { get; set; }
public DbSet<Report> Reports { get; set; }
}
还是我需要创建第二个 DbContext。如果我创建第二个 DbContext 我如何与IdentityDbContext中的用户进行通信。
我的第二个问题:如果我在IdentityDbContext中添加数据,如上所示,如何从ApplicationDbContext中的表中获取数据?因为我每次创建ApplicationDbContext的新实例时都需要传递DbContextOptions对象。我在Startup.cs中执行此操作:
// ===== Add DbContext ========
var connectionString = Configuration.GetConnectionString("DbConnection");
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
我在旧版本的 Asp.Net Core 中看到,我可以在 IdentityDbContext 构造函数中传递连接字符串,但现在只能传递 DbContextOptions。我不能这样做,例如:
[AllowAnonymous]
[HttpGet]
public IEnumerable<Project> GetRoles()
{
using (var db = new ApplicationDbContext())
{
return db.Projects;
}
}
解决方案
我可以将我的表添加到 IdentityDbContext,如下所示:
是的,这就是您创建自定义表格的方式。您不需要创建另一个DbContext
. 例如
public class Project
{
public int Id { get; set; }
public string Name { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<Project> Projects { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Project>(entity =>
{
entity.Property(e => e.Name)
.IsRequired()
.HasMaxLength(50);
});
base.OnModelCreating(builder);
}
}
注意:您可能需要运行dotnet ef migrations add Initial
和dotnet ef database update
进行数据库迁移。
使用 (var db = new ApplicationDbContext()) {...}
您不应该在控制器内部创建或管理 ApplicationDbContext
。如果这样做,它们就会变得紧密耦合,并且您无法实现单元测试。
相反,您让依赖反转 (DI) 容器为您管理它。例如
public class UserController : Controller
{
private readonly ApplicationDbContext _context;
public UserController(ApplicationDbContext context)
{
_context = context;
}
[AllowAnonymous]
[HttpGet]
public IEnumerable<Project> GetRoles()
{
return _context.Projects;
}
}
推荐阅读
- javascript - JavaScript 对象在 for 循环中仅存储最新值
- r - 如何绘制多个 y 的回归线
- haskell - Haskell:有没有简单的方法来检查两个字符串是否有相同的字符?
- grafana - 无法从 Clickhouse 数据源绘制 Grafana 中的数据
- java - java - 如何在java中的jar中围绕类的方法实现方面
- java - 如何使用 Selenium 和 Java 单击按钮?
- php - Jquery Get 请求不会从 php 文件中回显任何内容
- excel-formula - 无法过滤 sumprod 中的空单元格
- php - 字体文件在控制台上显示为未找到,并且在页面加载时未立即呈现
- python - 实时物体检测python