Với EF Code First Fluent API thì điều đó là không thể. Bạn luôn cần ít nhất một thuộc tính điều hướng để tạo ràng buộc khóa ngoại trong cơ sở dữ liệu.
Nếu bạn đang sử dụng Code First Migrations, bạn có tùy chọn để thêm di chuyển dựa trên mã mới trên bảng điều khiển trình quản lý gói ( add-migration SomeNewSchemaName
). Nếu bạn đã thay đổi một cái gì đó với mô hình của mình hoặc ánh xạ một quá trình di chuyển mới sẽ được thêm vào. Nếu bạn không thay đổi bất cứ điều gì, hãy bắt buộc di chuyển mới bằng cách sử dụng add-migration -IgnoreChanges SomeNewSchemaName
. Trong trường hợp này, quá trình di chuyển sẽ chỉ chứa rỗng Up
và Down
các phương thức.
Sau đó, bạn có thể sửa đổi Up
phương thức bằng cách thêm follwing vào nó:
public override void Up()
{
AddForeignKey("ChildTableName", "ParentId", "ParentTableName", "Id",
cascadeDelete: true);
CreateIndex("ChildTableName", "ParentId");
}
Chạy quá trình di chuyển này ( update-database
trên bảng điều khiển quản lý gói) sẽ chạy một câu lệnh SQL tương tự như sau (cho SQL Server):
ALTER TABLE [ChildTableName] ADD CONSTRAINT [FK_SomeName]
FOREIGN KEY ([ParentId]) REFERENCES [ParentTableName] ([Id])
CREATE INDEX [IX_SomeName] ON [ChildTableName] ([ParentId])
Ngoài ra, không cần di chuyển, bạn chỉ có thể chạy một lệnh SQL thuần túy bằng cách sử dụng
context.Database.ExecuteSqlCommand(sql);
đâu context
là một thể hiện của lớp ngữ cảnh dẫn xuất của bạn và sql
chỉ là lệnh SQL ở trên dưới dạng chuỗi.
Lưu ý rằng với tất cả EF này, không có manh mối nào ParentId
là khóa ngoại mô tả một mối quan hệ. EF sẽ chỉ coi nó như một thuộc tính vô hướng thông thường. Bằng cách nào đó, tất cả những điều trên chỉ là một cách phức tạp hơn và chậm hơn so với việc chỉ mở một công cụ quản lý SQL và thêm các ràng buộc bằng tay.