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 Up
und Down
Methoden.
Anschließend können Sie die Up
Methode ä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-database
auf 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 context
handelt es sich um eine Instanz Ihrer abgeleiteten Kontextklasse und sql
nur um den obigen SQL-Befehl als Zeichenfolge.
Beachten Sie, dass EF bei alledem keine Ahnung hat, dass ParentId
es 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.