Z EF Code First Fluent API jest to niemożliwe. Aby utworzyć ograniczenie klucza obcego w bazie danych, zawsze potrzebujesz co najmniej jednej właściwości nawigacji.
Jeśli korzystasz z migracji Code First, możesz dodać nową migrację opartą na kodzie w konsoli menedżera pakietów ( add-migration SomeNewSchemaName
). Jeśli coś zmieniłeś w swoim modelu lub mapowaniu, zostanie dodana nowa migracja. Jeśli nic nie zmieniłeś, wymuś nową migrację za pomocą add-migration -IgnoreChanges SomeNewSchemaName
. W tym przypadku migracja będzie zawierać tylko puste Up
i Down
metody.
Następnie możesz zmodyfikować Up
metodę, dodając do niej następującą:
public override void Up()
{
AddForeignKey("ChildTableName", "ParentId", "ParentTableName", "Id",
cascadeDelete: true);
CreateIndex("ChildTableName", "ParentId");
}
Uruchomienie tej migracji ( update-database
w konsoli zarządzania pakietami) spowoduje uruchomienie instrukcji SQL podobnej do poniższej (dla SQL Server):
ALTER TABLE [ChildTableName] ADD CONSTRAINT [FK_SomeName]
FOREIGN KEY ([ParentId]) REFERENCES [ParentTableName] ([Id])
CREATE INDEX [IX_SomeName] ON [ChildTableName] ([ParentId])
Alternatywnie, bez migracji, możesz po prostu uruchomić czyste polecenie SQL za pomocą
context.Database.ExecuteSqlCommand(sql);
gdzie context
jest instancją Twojej pochodnej klasy kontekstu i sql
jest po prostu powyższym poleceniem SQL jako ciągiem znaków.
Należy pamiętać, że z tym wszystkim EF nie ma pojęcia, że ParentId
jest to klucz obcy opisujący relację. EF uzna to tylko za zwykłą właściwość skalarną. W jakiś sposób wszystko powyższe jest tylko bardziej skomplikowanym i wolniejszym sposobem w porównaniu do zwykłego otwarcia narzędzia do zarządzania SQL i ręcznego dodania ograniczenia.