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

时间:2018-05-16 18:23:45

标签: asp.net asp.net-core entity-framework-6 asp.net-identity entity-framework-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; }
    }

或者我是否需要创建第二个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;
            }
        }

2 个答案:

答案 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 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;
    }
}

答案 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; }
    }

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