カスタム VSIX プラグインを使用して、モデルの一部に対してのみ移行を生成したいと考えています。CSharpMigrationCodeGenerator
オーバーライドメソッドによって継承されたクラスで生成されたコードをフィルタリングできることがわかりましたGenerate(IEnumerable<MigrationOperation> operations, string @namespace, string className)
。このメソッドで 1 つのテーブルの操作をフィルター処理しました。Add-Migration
移行を変更するときにパッケージ マネージャー コンソールで 2 回目の呼び出しを行う必要があることを読みました。やったよ。次に、データベースを更新しました。モデル全体の次の移行を作成したときに、フィルター処理されたテーブルのコードが生成されず、以前にフィルター処理されたテーブルのコードを自分で作成する必要がありました。
Add-Migration
移行ファイルに変更を加えたときに2回目にメソッドを呼び出すと、移行コードが調べられ、この移行を適用したときに発生するモデルのハッシュが作成されると思いました。
編集:
-Force パラメータを指定して -Force パラメータを指定せずに Add-Migration を呼び出そうとしました。-Force パラメーターを使用すると、移行コードに追加の変更を加えた場合、Up/Down メソッドの移行コードが上書きされます。そのため、この場合は -Force パラメータを使用すべきではないと思います。
私の MigrationCodeGenerator は構成コンストラクターで正しく設定されています: CodeGenerator = new MigrationCodeGenerator(tables);
操作をフィルタリングし、インデックスを生成しない MigrationCodeGenerator のコード:
using System.Collections.Generic;
using System.Data.Entity.Migrations.Model;
using System.Data.Entity.Migrations.Utilities;
using System.Data.Entity.Migrations.Design;
namespace MyNamespace.Migrations
{
public class MigrationCodeGenerator : CSharpMigrationCodeGenerator
{
/// <summary>
/// Tables for which to generate migration file
/// </summary>
private List<string> Tables;
public MigrationCodeGenerator(List<string> tables)
{
Tables = tables;
}
protected override void GenerateInline(CreateIndexOperation createIndexOperation, IndentedTextWriter writer) { }
protected override void Generate(CreateIndexOperation createIndexOperation, IndentedTextWriter writer) { }
protected override void Generate(DropIndexOperation dropIndexOperation, IndentedTextWriter writer) { }
protected override string Generate(IEnumerable<MigrationOperation> operations, string @namespace, string className)
{
if (Tables != null)
{
List<MigrationOperation> filteredOperations = new List<MigrationOperation>();
foreach (var operation in operations)
{
if (operation is CreateTableOperation)
{
CreateTableOperation createTableOperation = operation as CreateTableOperation;
if (Tables.Contains(createTableOperation.Name))
filteredOperations.Add(operation);
}
else if (operation is AddColumnOperation)
{
AddColumnOperation addColumnOperation = operation as AddColumnOperation;
if (Tables.Contains(addColumnOperation.Table))
filteredOperations.Add(operation);
}
else if (operation is AddPrimaryKeyOperation)
{
AddPrimaryKeyOperation addPrimaryKeyOperation = operation as AddPrimaryKeyOperation;
if (Tables.Contains(addPrimaryKeyOperation.Table))
filteredOperations.Add(operation);
}
else if (operation is AddForeignKeyOperation)
{
AddForeignKeyOperation addForeignKeyOperation = operation as AddForeignKeyOperation;
if (Tables.Contains(addForeignKeyOperation.DependentTable))
filteredOperations.Add(operation);
}
else if (operation is DropTableOperation)
{
DropTableOperation dropTableOperation = operation as DropTableOperation;
if (Tables.Contains(dropTableOperation.Name))
filteredOperations.Add(operation);
}
else if (operation is DropColumnOperation)
{
DropColumnOperation dropColumnOperation = operation as DropColumnOperation;
if (Tables.Contains(dropColumnOperation.Table))
filteredOperations.Add(operation);
}
else if (operation is DropPrimaryKeyOperation)
{
DropPrimaryKeyOperation dropPrimaryKeyOperation = operation as DropPrimaryKeyOperation;
if (Tables.Contains(dropPrimaryKeyOperation.Table))
filteredOperations.Add(operation);
}
else if (operation is DropForeignKeyOperation)
{
DropForeignKeyOperation dropForeignKeyOperation = operation as DropForeignKeyOperation;
if (Tables.Contains(dropForeignKeyOperation.DependentTable))
filteredOperations.Add(operation);
}
else if (operation is AlterColumnOperation)
{
AlterColumnOperation alterColumnOperation = operation as AlterColumnOperation;
if (Tables.Contains(alterColumnOperation.Table))
filteredOperations.Add(operation);
}
else if (operation is RenameColumnOperation)
{
RenameColumnOperation renameColumnOperation = operation as RenameColumnOperation;
if (Tables.Contains(renameColumnOperation.Table))
filteredOperations.Add(operation);
}
else if (operation is RenameTableOperation)
{
RenameTableOperation renameTableOperation = operation as RenameTableOperation;
if (Tables.Contains(renameTableOperation.Name))
filteredOperations.Add(operation);
}
else if (operation is SqlOperation)
{
filteredOperations.Add(operation);
}
}
return base.Generate(filteredOperations, @namespace, className);
}
return base.Generate(operations, @namespace, className);
}
}
}