Avec EF Code First Fluent API, c'est impossible. Vous avez toujours besoin d'au moins une propriété de navigation pour créer une contrainte de clé étrangère dans la base de données.
Si vous utilisez Code First Migrations, vous avez la possibilité d'ajouter une nouvelle migration basée sur le code sur la console du gestionnaire de packages ( add-migration SomeNewSchemaName
). Si vous avez modifié quelque chose avec votre modèle ou votre mappage, une nouvelle migration sera ajoutée. Si vous n'avez rien changé, forcez une nouvelle migration en utilisant add-migration -IgnoreChanges SomeNewSchemaName
. La migration ne contiendra que des méthodes Up
et des vides Down
dans ce cas.
Ensuite, vous pouvez modifier la Up
méthode en y ajoutant le suivant:
public override void Up()
{
AddForeignKey("ChildTableName", "ParentId", "ParentTableName", "Id",
cascadeDelete: true);
CreateIndex("ChildTableName", "ParentId");
}
L'exécution de cette migration ( update-database
sur la console de gestion des packages) exécutera une instruction SQL similaire à celle-ci (pour SQL Server):
ALTER TABLE [ChildTableName] ADD CONSTRAINT [FK_SomeName]
FOREIGN KEY ([ParentId]) REFERENCES [ParentTableName] ([Id])
CREATE INDEX [IX_SomeName] ON [ChildTableName] ([ParentId])
Sinon, sans migrations, vous pouvez simplement exécuter une commande SQL pure en utilisant
context.Database.ExecuteSqlCommand(sql);
où context
est une instance de votre classe de contexte dérivée et sql
est simplement la commande SQL ci-dessus sous forme de chaîne.
Sachez qu'avec tout cela EF n'a aucun indice qui ParentId
est une clé étrangère qui décrit une relation. EF ne le considérera que comme une propriété scalaire ordinaire. D'une manière ou d'une autre, tout ce qui précède n'est qu'un moyen plus compliqué et plus lent que d'ouvrir simplement un outil de gestion SQL et d'ajouter la contrainte à la main.