首页 > 解决方案 > 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;
            }
        }

标签: asp.netasp.net-coreentity-framework-6asp.net-identityentity-framework-core

解决方案


我可以将我的表添加到 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 Initialdotnet 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;
    }
}

推荐阅读