Con EF Code First Fluent API es imposible. Siempre necesita al menos una propiedad de navegación para crear una restricción de clave externa en la base de datos.
Si está utilizando Code First Migrations, tiene la opción de agregar una nueva migración basada en código en la consola del administrador de paquetes ( add-migration SomeNewSchemaName
). Si cambió algo con su modelo o mapeo, se agregará una nueva migración. Si no cambió nada, fuerce una nueva migración utilizando add-migration -IgnoreChanges SomeNewSchemaName
. La migración solo contendrá métodos vacíos Up
y Down
en este caso.
Luego puede modificar el Up
método agregando lo siguiente:
public override void Up()
{
AddForeignKey("ChildTableName", "ParentId", "ParentTableName", "Id",
cascadeDelete: true);
CreateIndex("ChildTableName", "ParentId");
}
Al ejecutar esta migración ( update-database
en la consola de administración de paquetes) se ejecutará una declaración SQL similar 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])
Alternativamente, sin migraciones, puede ejecutar un comando SQL puro usando
context.Database.ExecuteSqlCommand(sql);
donde context
es una instancia de su clase de contexto derivada y sql
es solo el comando SQL anterior como cadena.
Tenga en cuenta que con todo esto EF no tiene ni idea de que ParentId
es una clave externa que describe una relación. EF lo considerará solo como una propiedad escalar ordinaria. De alguna manera, todo lo anterior es solo una forma más complicada y lenta en comparación con simplemente abrir una herramienta de administración de SQL y agregar la restricción a mano.