複数データベース接続の登録
services.AddDbContextPool または services.AddDbContext を必要な分だけ追加することで、複数のDBコンテキストをDIコンテナに登録できます。
MySQL対応のためのEF Core拡張
Microsoft公式にはUseMySqlは存在しないため、Pomelo.EntityFrameworkCore.MySqlパッケージを導入して利用します。このメソッドはコミュニティ製ライブラリによって提供されています。
log4netの統合と初期化
Microsoft.Extensions.Logging.Log4Net.AspNetCore をインストール後、以下のようにホストビルダーでログプロバイダを構成します:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging((ctx, builder) =>
{
builder.ClearProviders();
builder.AddLog4Net("log4net.config");
})
.ConfigureWebHostDefaults(web => web.UseStartup<Startup>());
エンティティクラスの自動生成
Visual Studio拡張「EF Core Power Tools」を使用すると、既存のデータベーステーブルからPOCOクラスを自動生成できます。
Identityのカスタマイズ
ユーザーIDをGUIDから整数型に変更するには、IdentityUserを継承したカスタムクラスを作成し、主キー型をintに指定します。詳細は公式ドキュメント参照。
パスワードポリシーの緩和
以下のコードで大文字・小文字・記号・数字の必須要件を無効化できます:
services.AddDefaultIdentity<IdentityUser>(opt =>
{
opt.Password.RequireUppercase = false;
opt.Password.RequireLowercase = false;
opt.Password.RequireDigit = false;
opt.Password.RequireNonAlphanumeric = false;
}).AddEntityFrameworkStores<AppDbContext>();
メールではなくユーザー名での認証
スキャフォールディングで生成されたRegister.cshtml.csおよびLogin.cshtml.cs内のモデルと処理ロジックを修正し、Emailフィールドの代わりにUserNameを入力項目として扱うように変更します。
入力バリデーションの適用
DataAnnotations属性([Required], [StringLength]など)をViewModelに付与することで、クライアント/サーバー両方で入力チェックが可能になります。
レイアウトテンプレートの活用
_Layout.cshtml を定義することで、全ページ共通のヘッダーやフッター、ナビゲーションを一元管理できます。セクション(@RenderSection)を利用すれば個別ページごとの差分も柔軟に埋め込めます。
MVC関連サービスの選択肢
| 機能 | AddMvc | AddControllersWithViews | AddControllers | AddRazorPages |
|---|---|---|---|---|
| コントローラ | ○ | ○ | ○ | ○ |
| API Explorer | ○ | ○ | ○ | × |
| ビュー | ○ | ○ | × | ○ |
| Razor Pages | ○ | × | × | ○ |
| タグヘルパー | ○ | ○ | × | ○ |
動的サイドメニューの実装
部分ビュー(Partial View)とViewComponentを組み合わせることで、権限やルートに応じたメニュー構造を動的に生成できます。
log4net初期化エラー対応
ColoredConsoleAppender未定義エラーが出る場合、System.Text.Encoding.CodePagesを参照追加し、アプリ起動時に以下を実行:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
XmlConfigurator.Configure(new FileInfo("log4net.config"));
POST後に表示値を更新する方法
コントローラ内でモデル値を変更しても画面が更新されない場合は、ModelState.Clear() を呼び出してモデル状態をクリアしてください:
[HttpPost]
public IActionResult Process(InputModel model)
{
if (!ModelState.IsValid) return View(model);
ModelState.Clear(); // ← これがないと古い値が残る
model.Output = model.Input + " - processed";
return View(model);
}
Bootstrapカードデザイン
class="card" を持つdiv要素でコンテンツを囲むことで、影・枠・余白付きのモジュール化されたUIブロックを作成できます。内部にはcard-header, card-body, card-footerなどを配置可能です。
EF Core モデル属性と外部キー
プロパティに[NotMapped]を付けるとDBカラムとしてマッピングされません。
外部キーを明示しない場合、EFは命名規則(例:NavigationPropertyNameId)に基づいて自動生成します。意図しないカラムエラーが出たら、Fluent APIで明示的にリレーションを定義しましょう。
生SQLの実行
context.Database.ExecuteSqlRaw("UPDATE ...") を使うことで、直接SQL文を実行できます。大量データの一括更新など、LINQでは非効率な操作に有用です。