قاعدة البيانات — الترحيلات
ما هي
يُدار مخطط ManpowerIQ بواسطة ترحيلات EF Core 8 — 78 ملف ترحيل تحت ManpowerIQ.Infrastructure/Migrations/، مع ModelSnapshot بوصفه الحالة-الراهنة القانونية. الترحيلات هي مصدر حقيقة المخطط؛ لا يوجد DDL منفصل مُصان يدويًا.
كيف تعمل
- تُطبَّق صراحة، لا عند الإقلاع. تُشغَّل الترحيلات بـ
dotnet ef database update(مقابل اتصال المالك)؛ الـ API لا يُرحّل-عند-الإقلاع (صُحِّح في المرحلة 3 مقابل دليل التشغيل). تُتعقّب المجموعة المطبّقة في__EFMigrationsHistory.
dotnet ef database update --project src/ManpowerIQ.Infrastructure --startup-project src/ManpowerIQ.API
- سلسلتا اتصال. تستخدم الترحيلات اتصال المالك (
manpoweriq،BYPASSRLS)؛ يستخدم وقت التشغيلmanpoweriq_appالمربوط بـ RLS. لا يمكن لوقت التشغيل أبدًا تجاوز عزل المستأجر (انظر تعدّد المستأجرين). - snake_case بالاصطلاح —
.UseSnakeCaseNamingConvention()، فيصير C#BusinessUnitId←business_unit_id. - RLS يعيش في الترحيلات — 12 ترحيلًا تُشغّل خامًا
ENABLE/FORCE ROW LEVEL SECURITY+CREATE POLICY tenant_isolation(قائمة سماح انتقائية للجداول؛ انظر تعدّد المستأجرين). - افتراضيات
RowVersion— تحتاج أعمدة rowversion من نوعbyteaافتراضًا من جانب Postgres'\x'::bytea؛ توجد جولة من ترحيلات "RowVersionDefault" لأن مسارات الإدراج الأقدم فشلت بدونه (حالات حافة الورقة 01). - مخطط Hangfire يُثبَّت منفصلًا ببوابة إقلاع (
HangfireSchemaBootstrap،PrepareSchemaIfNecessary)، لا بترحيلات EF هذه — تعيش جداوله الـ12 في مخططhangfire.
واقع إعادة الضبط — إسقاط + إعادة إنشاء
ترحيلات بيانات الزرع ليست عديمة-الأثر مقابل إعادة ضبط من نمط الاقتطاع (PB-025). عدة ترحيلات تُدرج (INSERT) صفوف زرع/مرجعية؛ اقتطاع الجداول (مثل إعادة ضبط Respawn) يترك __EFMigrationsHistory يقول إن الزرع جرى بينما الصفوف غائبة، فلا يُعيد الزرع الإدراج. لذا فإن إعادة الضبط المدعومة هي إسقاط + إعادة إنشاء، لا اقتطاع (دليل التشغيل §4a / §11):
dotnet ef database drop -f --project src/ManpowerIQ.Infrastructure --startup-project src/ManpowerIQ.API
dotnet ef database update --project src/ManpowerIQ.Infrastructure --startup-project src/ManpowerIQ.API
علامة فارقة على الحالة المكسورة: POST /api/auth/login-dev يُعيد 401 Unknown user وأعداد صفوف §4b تقرأ صفرًا — زرع المستخدم التجريبي مفقود لأن المخطط اقتُطع لا أُسقط (تحذير دليل التشغيل §4a).
مزالق / قيود
- لا تعتمد على الاقتطاع لإعادة الضبط — استخدم إسقاط + إعادة إنشاء، وإلا فلن يُستعاد خط أساس الزرع (PB-025).
- لا ترحيل-عند-الإقلاع — طبّق الترحيلات صراحة قبل تشغيل الـ API؛ يفترض التطبيق أن المخطط بالفعل عند HEAD.
- توجد ترحيلات-تنازلية لكن مسار إعادة الضبط هو إسقاط+إعادة إنشاء — عامِل
Down()كنقيض بنيوي للمراجعة، لا كآلية إعادة الضبط اليومية. __EFMigrationsHistoryهو المرجع بشأن المطبّق — عدم التطابق بينه وبين الصفوف الفعلية هو توقيع PB-025.- يُستعاد تلف مخطط Hangfire يدويًا (
DROP SCHEMA hangfire CASCADE;→ تُعيد البوابة التثبيت)، وهو مقصود ألا يُؤتمت لتبقى العمليات المدمّرة صريحة-للمشغّل (دليل التشغيل §5).
حالة البناء
متاح — 78 ترحيلًا مطبّقًا عبر EF؛ إعادة ضبط إسقاط+إعادة إنشاء هي سير العمل المحلي الموثّق.
ذو صلة
- نظرة عامة على المخطط · الزرع والبيانات المرجعية
- تعدّد المستأجرين — فصل الاتصالين + ترحيلات RLS.
- التشغيل المحلي وإعادة الضبط — خطوات إعادة الضبط الموجّهة للمشغّل.
- المصدر:
Migrations/(78 ملفًا) + ModelSnapshot؛ دليل التشغيلLocal_Environment_Runbook.md§4a/§11؛ PB-025.