私は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; }
}
または、2番目のDbContextを作成する必要がありますか。また、2番目のDbContextを作成した場合、IdentityDbContextでユーザーと通信するにはどうすればよいですか。
そして私の2番目の質問:上記のようにIdentityDbContextにデータを追加する場合、ApplicationDbContextのテーブルからデータを取得するにはどうすればよいですか? ?新しいインスタンスを作成するたびにDbContextOptionsオブジェクトを渡す必要があるためApplicationDbContext。私はこれをStartup.csで行います:
// ===== Add DbContext ========
var connectionString = Configuration.GetConnectionString("DbConnection");
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
古いバージョンのAsp.NetCoreで、IdentityDbContextコンストラクターで接続文字列を渡すことができますが、現在はDbContextOptionsのみを渡すことができます。そして、私はできません、例えばこれ:
[AllowAnonymous]
[HttpGet]
public IEnumerable<Project> GetRoles()
{
using (var db = new ApplicationDbContext())
{
return db.Projects;
}
}
次のように、テーブルを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
を実行する必要がある場合があります。
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;
}
}
私は自分の問題を解決し、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