Com EF Code First Fluent API isso é impossível. Você sempre precisa de pelo menos uma propriedade de navegação para criar uma restrição de chave estrangeira no banco de dados.
Se você estiver usando Migrações Code First, terá a opção de adicionar uma nova migração baseada em código no console do gerenciador de pacotes ( add-migration SomeNewSchemaName
). Se você mudou algo com seu modelo ou mapeamento, uma nova migração será adicionada. Se você não alterou nada force uma nova migração usando add-migration -IgnoreChanges SomeNewSchemaName
. A migração conterá apenas métodos Up
e vazios Down
neste caso.
Depois, você pode modificar o Up
método adicionando o seguinte a ele:
public override void Up()
{
AddForeignKey("ChildTableName", "ParentId", "ParentTableName", "Id",
cascadeDelete: true);
CreateIndex("ChildTableName", "ParentId");
}
Executar esta migração ( update-database
no console de gerenciamento de pacote) executará uma instrução SQL semelhante a esta (para SQL Server):
ALTER TABLE [ChildTableName] ADD CONSTRAINT [FK_SomeName]
FOREIGN KEY ([ParentId]) REFERENCES [ParentTableName] ([Id])
CREATE INDEX [IX_SomeName] ON [ChildTableName] ([ParentId])
Como alternativa, sem migrações, você pode simplesmente executar um comando SQL puro usando
context.Database.ExecuteSqlCommand(sql);
onde context
é uma instância de sua classe de contexto derivada e sql
é apenas o comando SQL acima como string.
Esteja ciente de que com tudo isso EF não tem idéia de que ParentId
é uma chave estrangeira que descreve um relacionamento. EF irá considerá-lo apenas como uma propriedade escalar comum. De alguma forma, tudo acima é apenas uma maneira mais complicada e lenta em comparação com apenas abrir uma ferramenta de gerenciamento de SQL e adicionar a restrição manualmente.