EF Code First Fluent APIでは、それは不可能です。データベースに外部キー制約を作成するには、常に少なくとも1つのナビゲーションプロパティが必要です。
コードファーストマイグレーションを使用している場合は、パッケージマネージャーコンソール(add-migration SomeNewSchemaName
)で新しいコードベースのマイグレーションを追加するオプションがあります。モデルまたはマッピングで何かを変更した場合、新しい移行が追加されます。何も変更しなかった場合は、を使用して新しい移行を強制しadd-migration -IgnoreChanges SomeNewSchemaName
ます。この場合Up
、移行には空のDown
メソッドとメソッドのみが含まれます。
次にUp
、以下を追加してメソッドを変更できます。
public override void Up()
{
AddForeignKey("ChildTableName", "ParentId", "ParentTableName", "Id",
cascadeDelete: true);
CreateIndex("ChildTableName", "ParentId");
}
この移行を(update-database
パッケージ管理コンソールで)実行すると、次のようなSQLステートメントが実行されます(SQL Serverの場合)。
ALTER TABLE [ChildTableName] ADD CONSTRAINT [FK_SomeName]
FOREIGN KEY ([ParentId]) REFERENCES [ParentTableName] ([Id])
CREATE INDEX [IX_SomeName] ON [ChildTableName] ([ParentId])
または、移行せずに、を使用して純粋なSQLコマンドを実行することもできます。
context.Database.ExecuteSqlCommand(sql);
ここで、context
は派生コンテキストクラスのインスタンスであり、sql
文字列としての上記のSQLコマンドです。
このすべてで、EFにはParentId
関係を説明する外部キーである手がかりがないことに注意してください。EFはそれを通常のスカラープロパティとしてのみ見なします。どういうわけか、上記のすべては、SQL管理ツールを開いて手動で制約を追加する場合に比べて、より複雑で時間がかかる方法にすぎません。