機能が正しく機能するためには、データベースにシードデータ(基本的にはいくつかのデフォルト値)が存在する必要がある新しい機能が必要です。現在、これは2つの異なるシナリオにあり、シードデータの生成/挿入の最良の方法は、使用するデータストアによって異なるようです。ここでは、テスト目的でデータをシードすることについて話しているのではありません。
たとえば、一部の機能では、SQL Serverにテーブルが存在する必要があります。バージョン間の手動移行(基本的にはスキーマの相違)を使用しているため、このためのシードデータの挿入は、スキーマを更新する同じSQLスクリプトで実行するのが理にかなっています。一部のORMがこれを処理するように見える方法は、データを作成する初期化コードにSeed()メソッド(または同等のメソッド)を含めることです。
別の機能は、データストアとしてAzure Table Storage(ATS)を使用することです。スキーマレスであるため、ここにテーブルを作成するスクリプトはありませんが、アプリケーションは初回実行時にテーブルの存在を確認し、テーブルが存在しない場合は作成します。つまり、通常、展開を進める前にテーブルを作成しません。 ATSにデータをシードするには、環境を事前に設定するか(コードを記述してどこかに実行する必要がある)、テーブルの存在を確認するコンポーネントに、作成時にデータを挿入させることができます。
コード内のクラスにシードデータを含めることには長期的な不利な点がありますか?それがそれを配置するのに最適な場所である場合、データをまとめておく方が理にかなっています(たとえば、Seedアプリの起動時に実行されるデータを含むクラス)または Repository は、クエリを発行する前に基本データが存在することを確認する責任がありますか?
実際には2つのものが必要です。
私はこのような問題を解決します:
製品に機能を追加する場合
コードのクラスにシードデータを含めることには長期的な欠点がありますか?それがそれを置くのに最適な場所である場合
コードに追加する場合、アプリケーションの起動時にDBをシードする必要があることを検出して実行する場合は、コードに追加しないでください。これにはいくつかの理由があります(Alphaが提供するものと類似または同じものもあります)。
これは、コードの一部ではなく、コードのデプロイメントの一部である必要があります。これにより、シードの作成が意図的に行われます。
コードのクラスにシードデータを含めることには長期的な欠点がありますか?それがそれを置くのに最適な場所である場合
逆に、これはこの種の初期化を行うのに最適な場所だと私は主張します。コードはこのデータ、その形状、内容に直接依存しているため、この初期化がコードに直接結び付けられていることは、実際に起こり得る最高のことです。
ただし、通常は誰もそれを行いません。通常、いくつかの理由により、スクリプトまたはデプロイメントステップを作成します。
これがコードベースで処理される例として、Entity FrameworkやRailsの移行があります。初期化、更新、データのシードと変換を行います。
実際のストレージはそれほど重要ではありません。 Azure Tablesはスキーマレスである可能性がありますが、コードでは、そのデータを操作するために特定のスキーマが存在する必要があります。
これを言っても、私の推奨事項は次のとおりです。