اتكلمنا قبل كدا عن الموضوع دا في Migration
خلينا نوضح الخطوات اللي انت ذكرتها بخصوص الـ Migrations والـ DbContext في مشروعك:
Migrations
- إضافة Migration:
- هعمل Run migration في البروجكت اللي فيه
appsetting
اللي فيه الـ Connection string اللي هو الـ API - مش محتاج تحدد الـ Output لو كنت محدده قبل كده في المشروع.
- هعمل Run migration في البروجكت اللي فيه
Add-Migration "OrderModule" -Context StoreContext
// -O Data/Migrations
-
التأكد من وجود Empty Constructor:
- لازم يكون فيه Constructor فاضي لكل Entity عشان الـ Entity Framework يقدر يتعامل معاها بشكل صحيح. لو مش موجود، ممكن تواجه مشاكل أثناء الـ Migration.
-
تأثير الـ Configurations:
- حتى لو مش عامل DbSet في الـ
StoreContext
، الـ Configurations اللي عملتها باستخدامIEntityTypeConfiguration
هتخلي الـ Entity Framework يفهم إن دي هتبقى Tables في الـ Database.
- حتى لو مش عامل DbSet في الـ
-
حذف Migration:
- لو عايز تمسح Migration، ممكن تستخدم
Remove-Migration -Context StoreContext
.
- لو عايز تمسح Migration، ممكن تستخدم
-
إضافة DbSet:
- من الأفضل تضيف DbSet لكل Entity في الـ
StoreContext
عشان اللي بيقرأ الكود يبقى عارف إيه الحاجات اللي عندك:public DbSet<Order> Orders {get; set;} public DbSet<OrderItem> OrderItems {get; set;} public DbSet<DeliveryMethod> DeliveryMethods {get; set;}
- من الأفضل تضيف DbSet لكل Entity في الـ
التعامل مع Foreign Key وCascade Delete
- الـ Default للـ Foreign Key بيكون Cascade، يعني لو مسحت من الجدول الأساسي، هيمسح اللي مرتبط بيه في الجدول التاني.
- لو عايز تخلي الـ Delivery Method لو اتمسحت يحطها ب Null بدل ما يمسحها، ممكن تستخدم:
builder.HasOne(O => O.DeliveryMethod)
.WithMany()
.OnDelete(DeleteBehavior.SetNull);
- التعامل مع Nullable Foreign Key عندنا 3 حلول:
- تضيف الـ Foreign Key كـ Nullable في الكود:
public int? DeliveryMethodId {get; set;} // FK
- نضيف انها ممكن تبقا Nullable على الـ Navigational Property:
public DeliveryMethod? DeliveryMethod {get; set;}
- تعدلها في الـ Migration يدويًا:
DeliveryMethodId = table.Column<int?>(type: "int", nullable: true)
- ولازم تعدلها في الـ Snapshot كمان:
b.Property<int?>("DeliveryMethodId")
.HasColumnType("int");
تحديث الـ Database تلقائيًا
- البرنامج بتاعي بيتعمل Run على السيرفر مرة واحدة اللي هي الـ Deploy
- ممكن تخلي البرنامج يعمل
Update-Database
تلقائيًا عند بدء التشغيل. - ده مفيد لو مش هتقدر تعمل التحديثات يدويًا على السيرفر.
- ممكن تضيف الكود ده في الـ Program عشان يتنفذ عند الـ Deploy.