データ永続性の管理

このセクションでは、LinoEntity Framework Core をどのように構成してドメイン層を完全に分離し、データベースのマイグレーションプロセスを予測可能かつ管理可能にするかを学びます — 伝統的なモノリシックサービスでも、モジュラーサービスでも同様です。


lino new service コマンドでサービスを作成すると、CLIは2つの重要な選択を求めます:

  • アーキテクチャ — 伝統的なサービスまたはモジュラーサービス。
  • データプロバイダーSqlServer または PostgreSql(将来的には他のプロバイダーも追加予定です)。

伝統的(モノリシック)サービスでもモジュラー(モノリシックモジュラー)サービスでも、サービスごとに単一のデータベースが使用されます。ただし、モジュラーサービスでは各モジュールが同一データベース内の別々のスキーマにマッピングされます。 これにより、各bounded contextが独立した論理的名前空間を保持し、機能的分離独立したバージョニングより整理された安全なマイグレーションが保証されます。

エンティティタイプ構成

LinoはPersistence‑Ignorantの原則に従っています:ドメインエンティティはインフラの詳細を知りません。 そのため、すべてのORMマッピングはIEntityTypeConfiguration<T>を実装するクラスに移され、Configurations/<EntityName>Configuration.csに配置されています。

  • 各エンティティは専用の構成ファイルを持っています。
  • グローバルな規約(例:decimal(18,2)、照合順序、DateTimeutcとして扱う)はModelConfigurationに集中管理できます。
  • 構成はDbContextOnModelCreating内でmodelBuilder.ApplyConfigurationsFromAssembly(...)を使って適用されます。

DbContexts

DbContextはアプリケーションのトランザクション単位を表します。Linoは自動的に生成します:

  • 従来型サービス — すべてのDbSet<TEntity>を含む単一のAppDbContext
  • モジュール型サービス — 各bounded contextごとに<Module>DbContextを用意します。これにより、各モジュールのコンパイル速度が速くなり、マイグレーションサイクルが短縮され、マージコンフリクトのリスクが減少します。

すべてのDbContext<Module>/Infrastructure.Persistenceに登録され、IUnitOfWorkを通じて公開され、dependency injectionで解決されます。

リポジトリ

具体的なリポジトリは <Module>/Infrastructure.Persistence.Repositories にあり、<Module>/Domain.Repositories 名前空間で定義されたインターフェースを実装します。 各リポジトリは以下の役割を持ちます:

  • 複雑なクエリ(LINQ、FromSql、DTOプロジェクション)をカプセル化します。
  • ドメインに必要なメソッドのみを公開します(アグリゲートルート中心)。

ユニット・オブ・ワーク (Unit of Work)

ユニット・オブ・ワーク は複数のリポジトリを調整する トランザクションの境界 として機能し、すべての操作が アトミック に実行されることを保証します。 単純なシナリオでは、DbContext 自体で十分な場合が多いですが、Lino はより高度な制御と柔軟性を提供する専用の実装(UnitOfWork)を生成します。

  • 必要に応じて、BeginTransactionCommitRollback による手動トランザクション制御を可能にします。
  • 現在のトランザクション内でドメインイベントを公開し、同じcommitサイクル内で実行されることを保証します。
  • アウトボックス統合イベントを永続化し、トランザクションアウトボックスパターンに従って分散アーキテクチャのシナリオで信頼性の高い配信を保証します(適用可能な場合)。

マイグレーションの管理

LinoはEntity Framework Coreを用いてデータベースマイグレーションのプロセスを完全に簡素化・自動化し、繰り返しの作業や一般的な不整合のリスクを排除します。 新しいマイグレーションを作成するには、次のコマンドを実行してください:

lino database migrations add

コマンドを実行すると、対話型ウィザードが次の情報を求めます:

  • サービス — マイグレーションが適用されるプロジェクト名。
  • モジュール — (モジュール型サービスの場合のみ)変更が属するモジュール。
  • マイグレーション名変更内容の説明を入力してください(例:AddCustomerIsActive)。 Linoは現在のバージョンとインクリメント順序を自動的に管理し、.sqlスクリプトを次のパターンで生成します: /Scripts/v1.2.3/001_AddCustomerIsActive.sql
注意:Entity Frameworkが生成する.csファイルに加えて、LinoはDDLコマンドを含む対応する.sqlスクリプトも自動生成します。 これにより、手動での変更適用やインフラチームやDBAによるレビューが容易になります。
処理されていないエラーが発生しました。 再読み込み 🗙