我使用 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;
            }
        }

最佳答案



是的,这就是您创建自定义表的方式。您不需要创建另一个 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 以进行数据库迁移。



您不应在 Controller 内创建或管理 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;
    }
}

关于Asp.Net 核心 : Add data to IdentityDbContext or use DbContext,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50377705/

10-12 21:20