Mit EF Code First Fluent API ist dies nicht möglich. Sie benötigen immer mindestens eine Navigationseigenschaft, um eine Fremdschlüsseleinschränkung in der Datenbank zu erstellen.
Wenn Sie Code First Migrations verwenden, können Sie der Paketmanagerkonsole ( add-migration SomeNewSchemaName) eine neue codebasierte Migration hinzufügen . Wenn Sie etwas an Ihrem Modell geändert oder zugeordnet haben, wird eine neue Migration hinzugefügt. Wenn Sie nichts geändert haben, erzwingen Sie eine neue Migration mit add-migration -IgnoreChanges SomeNewSchemaName. Die Migration enthält in diesem Fall nur leere Upund DownMethoden.
Anschließend können Sie die UpMethode ändern , indem Sie Folgendes hinzufügen:
public override void Up()
{
// other stuff...
AddForeignKey("ChildTableName", "ParentId", "ParentTableName", "Id",
cascadeDelete: true); // or false
CreateIndex("ChildTableName", "ParentId"); // if you want an index
}
Wenn Sie diese Migration ( update-databaseauf der Paketverwaltungskonsole) ausführen, wird eine ähnliche SQL-Anweisung ausgeführt (für SQL Server):
ALTER TABLE [ChildTableName] ADD CONSTRAINT [FK_SomeName]
FOREIGN KEY ([ParentId]) REFERENCES [ParentTableName] ([Id])
CREATE INDEX [IX_SomeName] ON [ChildTableName] ([ParentId])
Alternativ können Sie ohne Migrationen einfach einen reinen SQL-Befehl mit ausführen
context.Database.ExecuteSqlCommand(sql);
Dabei contexthandelt es sich um eine Instanz Ihrer abgeleiteten Kontextklasse und sqlnur um den obigen SQL-Befehl als Zeichenfolge.
Beachten Sie, dass EF bei alledem keine Ahnung hat, dass ParentIdes sich um einen Fremdschlüssel handelt, der eine Beziehung beschreibt. EF betrachtet es nur als gewöhnliche Skalareigenschaft. Irgendwie ist all das nur komplizierter und langsamer als das Öffnen eines SQL-Verwaltungstools und das manuelle Hinzufügen der Einschränkung.