Nik*_*ruk 3 asp.net entity-framework-6 asp.net-identity entity-framework-core asp.net-core
我使用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; }
}
Run Code Online (Sandbox Code Playgroud)
还是我需要创建第二个DbContext。如果我创建第二个DbContext,该如何与IdentityDbContext中的 User进行通信。
我的第二个问题:如果我像上面那样在IdentityDbContext中添加数据,如何从ApplicationDbContext中的表中获取数据?因为每次创建新实例时都需要传递DbContextOptions对象-f ApplicationDbContext。我在Startup.cs中这样做:
// ===== Add DbContext ========
var connectionString = Configuration.GetConnectionString("DbConnection");
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
Run Code Online (Sandbox Code Playgroud)
我在较旧版本的Asp.Net Core中看到,我可以在IdentityDbContext构造函数中传递连接字符串,但现在只能传递DbContextOptions。而且我做不到,例如:
[AllowAnonymous]
[HttpGet]
public IEnumerable<Project> GetRoles()
{
using (var db = new ApplicationDbContext())
{
return db.Projects;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以将表添加到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);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:您可能需要运行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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5054 次 |
| 最近记录: |