З EF Code First Fluent API це неможливо. Завжди потрібна хоча б одна властивість навігації для створення обмеження зовнішнього ключа в базі даних.
Якщо ви використовуєте перші міграції коду, у вас є можливість додати нову міграцію на основі коду на консолі менеджера пакетів ( 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 та додаванням обмежень вручну.