З 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 та додаванням обмежень вручну.