使用EF Code First Fluent API,这是不可能的。您始终至少需要一个导航属性才能在数据库中创建外键约束。
如果您正在使用代码优先迁移,则可以选择在软件包管理器控制台(add-migration SomeNewSchemaName
)上添加基于代码的新迁移。如果您对模型进行了更改或映射,则将添加新的迁移。如果您没有进行任何更改,请使用强制进行新的迁移add-migration -IgnoreChanges SomeNewSchemaName
。在这种情况下,迁移将仅包含emptyUp
和Down
方法。
然后,您可以Up
通过添加以下方法来修改该方法:
public override void Up()
{
AddForeignKey("ChildTableName", "ParentId", "ParentTableName", "Id",
cascadeDelete: true);
CreateIndex("ChildTableName", "ParentId");
}
运行此迁移(update-database
在程序包管理控制台上)将运行类似于以下语句(对于SQL Server):
ALTER TABLE [ChildTableName] ADD CONSTRAINT [FK_SomeName]
FOREIGN KEY ([ParentId]) REFERENCES [ParentTableName] ([Id])
CREATE INDEX [IX_SomeName] ON [ChildTableName] ([ParentId])
或者,无需迁移,您可以使用以下命令运行纯SQL命令:
context.Database.ExecuteSqlCommand(sql);
其中context
是您的派生上下文类的实例,而sql
只是上述SQL命令的字符串。
请注意,对于所有这些EF,它都不ParentId
是描述关系的外键。EF只会将其视为普通的标量属性。与仅打开SQL管理工具并手动添加约束相比,上述所有方法仅是一种更复杂,更慢的方法。