首页 文章

Asp.Net Core:将数据添加到IdentityDbContext或使用DbContext

提问于
浏览
2

我使用 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构造函数中传递Connection String,但现在只有DbContextOptions . 我做不到,例如:

[AllowAnonymous]
        [HttpGet]
        public IEnumerable<Project> GetRoles()
        {
            using (var db = new ApplicationDbContext())
            {
                return db.Projects;
            }
        }

2 回答

  • 4

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

    Note: 您可能需要运行 dotnet ef migrations add Initialdotnet ef database update 才能进行数据库迁移 .

    using(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;
        }
    }
    
  • 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; }
        }
    

    这是资源:https://medium.com/@ozgurgul/asp-net-core-2-0-webapi-jwt-authentication-with-identity-mysql-3698eeba6ff8

相关问题