Ядро Asp.Net: добавьте данные в IdentityDbContext или используйте DbContext - PullRequest
0 голосов
/ 16 мая 2018

Я работаю с 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 ? Потому что мне нужно передавать DbContextOptions объект каждый раз, когда я создаю новый экземпляр ApplicationDbContext . Я делаю это в 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;
            }
        }

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Могу ли я добавить свои таблицы в 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 Initial и dotnet ef database update для переноса базы данных.

с использованием (var db = new ApplicationDbContext()) {...}

Вы не должны создавать или управлять ApplicationDbContext внутри контроллера.Если вы это сделаете, они станут тесно связанными, и вы не сможете выполнить модульные тесты.

Вместо этого вы позволяете контейнеру инверсии зависимостей управлять им.Например,

public class UserController : Controller
{
    private readonly ApplicationDbContext _context;

    public UserController(ApplicationDbContext context)
    {
        _context = context;
    }

    [AllowAnonymous]
    [HttpGet]
    public IEnumerable<Project> GetRoles()
    {
        return _context.Projects;
    }
}
0 голосов
/ 16 мая 2018

Я решаю свою проблему, я просто заменил код в 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

...