我使用 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 中的表中获取数据? 因为我每次创建新的实例оf ApplicationDbContext 时都需要传递 DbContextOptions 对象。我在 Startup.cs :
中执行此操作// ===== Add DbContext ========
var connectionString = Configuration.GetConnectionString("DbConnection");
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
我在旧版本的Asp.Net Core中看到,我可以在IdentityDbContext构造函数中传递Connection String,但现在只有DbContextOptions。 我做不到,例如:
[AllowAnonymous]
[HttpGet]
public IEnumerable<Project> GetRoles()
{
using (var db = new ApplicationDbContext())
{
return db.Projects;
}
}
答案 0 :(得分:4)
我可以将我的表添加到IdentityDbContext,如下所示:
是的,这是您创建自定义表的方式。您无需创建另一个DbContext
。 E.g。
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;
}
}
答案 1 :(得分:0)
我解决了我的问题,我只是替换了ApplicationDbContext中的代码,并从方法获取连接字符串:
public class ApplicationDbContext : IdentityDbContext<User>
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(GetConnectionString());
}
private static string GetConnectionString()
{
const string databaseName = "EmployeeReportsDb";
const string databasePass = "SuperPuper_Random_DB-key!";
return $"Server=localhost;" +
$"database={databaseName};" +
$"Trusted_Connection = True;" +
$"MultipleActiveResultSets = True;" +
$"pwd={databasePass};" +
$"pooling=true;";
}
public DbSet<ProgrammerRole> ProgrammerRoles { get; set; }
public DbSet<Project> Projects { get; set; }
public DbSet<SubProject> SubProjects { get; set; }
public DbSet<Report> Reports { get; set; }
}