EF Code First Fluent API ile bu imkansızdır. Veritabanında yabancı anahtar kısıtlaması oluşturmak için her zaman en az bir gezinti özelliğine ihtiyacınız vardır.
Code First Migrations kullanıyorsanız, paket yöneticisi konsolunda ( add-migration SomeNewSchemaName
) yeni bir kod tabanlı geçiş ekleme seçeneğiniz vardır . Modelinizle veya eşlemenizle bir şey değiştirdiyseniz, yeni bir geçiş eklenecektir. Hiçbir şeyi değiştirmediyseniz kullanarak yeni bir geçişi zorlayın add-migration -IgnoreChanges SomeNewSchemaName
. Taşıma, bu durumda yalnızca boş Up
ve Down
yöntemleri içerecektir .
Ardından Up
, aşağıdaki ifadeyi ekleyerek yöntemi değiştirebilirsiniz :
public override void Up()
{
AddForeignKey("ChildTableName", "ParentId", "ParentTableName", "Id",
cascadeDelete: true);
CreateIndex("ChildTableName", "ParentId");
}
Bu geçişi çalıştırmak ( update-database
paket yönetim konsolunda) şuna benzer bir SQL ifadesi çalıştırır (SQL Server için):
ALTER TABLE [ChildTableName] ADD CONSTRAINT [FK_SomeName]
FOREIGN KEY ([ParentId]) REFERENCES [ParentTableName] ([Id])
CREATE INDEX [IX_SomeName] ON [ChildTableName] ([ParentId])
Alternatif olarak, geçişler olmadan, yalnızca bir SQL komutunu kullanarak çalıştırabilirsiniz.
context.Database.ExecuteSqlCommand(sql);
burada context
türetilmiş bağlam sınıfınızın bir örneğidir ve sql
dize olarak yukarıdaki SQL komutudur.
Tüm bu EF ile ParentId
bir ilişkiyi tanımlayan yabancı anahtarın hiçbir ipucu olmadığını unutmayın . EF bunu yalnızca sıradan bir skaler özellik olarak değerlendirecektir. Her nasılsa yukarıdakilerin tümü, bir SQL yönetim aracını açmaya ve kısıtlamayı elle eklemeye kıyasla yalnızca daha karmaşık ve daha yavaş bir yoldur.