المشاركات

عرض الرسائل ذات التصنيف Entity Framework Core

.NET Core - تثبيت الأدوات (SDK، Visual Studio / VS Code)

.NET Core - تثبيت الأدوات (SDK، Visual Studio / VS Code) لبدء العمل على ‎ .NET Core ، نحتاج إلى تثبيت بعض الأدوات الأساسية التي تُمكّنك من تطوير وتشغيل التطبيقات بسهولة. في هذا الدرس، سنوضح الأدوات المطلوبة، كيفية تثبيتها، وأفضل الممارسات لاختيار البيئة المناسبة. 1. ما هو SDK؟ الـ SDK أو Software Development Kit هو مجموعة من الأدوات التي تتيح لك: إنشاء تطبيقات .NET Core. تشغيلها واختبارها محليًا. إدارة الحزم، المشاريع، والإصدارات. 🔗 لتحميل آخر إصدار من .NET SDK: https://dotnet.microsoft.com/en-us/download 2. اختيار بيئة التطوير (IDE) توجد بيئتان أساسيتان يمكنك استخدامهما مع ‎.NET Core: Visual Studio (Windows فقط): الخيار الأقوى والأشمل لمشاريع كبيرة. Visual Studio Code (Windows / Linux / macOS): خفيف وسريع ويدعم الإضافات. 🔗 لتحميل Visual Studio: https://visualstudio.microsoft.com/ 🔗 لتحميل Visual Studio Code: https://code.visualstudio.com/ 3. التحقق من التثبيت بعد تثبيت الـ SDK، تأكد من نجاح التثبيت بكتابة الأ...

Entity Framework - نظرة على دورة حياة EF Core (DbContext، Change Tracker، SaveChanges)

Entity Framework - نظرة على دورة حياة EF Core (DbContext، Change Tracker، SaveChanges) لفهم كيفية عمل Entity Framework Core بفعالية، يجب أن نتعرف على دورة حياة الكائنات داخل EF Core، وخاصة الثلاثة مكونات الأساسية: DbContext ، و Change Tracker ، و SaveChanges . هذا الدرس يقدم نظرة مبسطة وعملية على كيف تُدار البيانات في الخلفية. 🔹 ما هو DbContext؟ هو الكلاس الرئيسي في EF Core المسؤول عن الاتصال بقاعدة البيانات وتعقب الكيانات (Entities). من خلاله يمكننا الاستعلام (Query) أو الإضافة (Add) أو الحذف (Remove) أو التعديل (Update). public class AppDbContext : DbContext { public DbSet<Student> Students { get; set; } } يتم إنشاء كائن من DbContext عادة باستخدام Dependency Injection، ويتم التخلص منه تلقائيًا بعد الاستخدام. 🔸 ما هو Change Tracker؟ Change Tracker هو المكون الذي يتتبع حالة الكيانات (Entities) داخل DbContext. عندما نقوم بتعديل أو إضافة كائن، يقوم EF Core بتسجيل هذه التغييرات داخليًا. 🔁 حالات الكائنات (Entity States): Added: الكائن ...

Entity Framework - الفرق بين LINQ وSQL التقليدي

Entity Framework - الفرق بين LINQ وSQL التقليدي عند استخدام Entity Framework Core ، نلاحظ أن طريقة الاستعلام لا تتم باستخدام SQL التقليدي، بل باستخدام تقنية تُدعى LINQ وهي اختصار لـ Language Integrated Query . دعونا نوضح الفرق بين LINQ وSQL التقليدي من حيث المفهوم، الاستخدام، والتكامل مع EF Core. 🔹 ما هو SQL التقليدي؟ SQL (Structured Query Language) هي لغة قياسية للتعامل مع قواعد البيانات. تُستخدم لتنفيذ استعلامات مثل SELECT, INSERT, UPDATE, DELETE. SELECT Name, Age FROM Students WHERE Age > 18 ORDER BY Name; 🔸 ما هو LINQ؟ LINQ هي تقنية داخل C# تتيح كتابة استعلامات بلغة C# نفسها، وتُترجم داخليًا إلى SQL عند استخدام EF Core. تساعد LINQ في كتابة استعلامات قوية وآمنة ومتكاملة مع البيئة الكائنية (OOP). var result = context.Students .Where(s => s.Age > 18) .OrderBy(s => s.Name) .Select(s => new { s.Name, s.Age }) .ToList(); 📊 مقارنة بين LINQ وSQL الجانب LINQ SQL التقليدي ...

Entity Framework - بنية المشاريع عند استخدام EF Core (فصل الطبقات - Layered Architecture)

Entity Framework - بنية المشاريع عند استخدام EF Core (فصل الطبقات - Layered Architecture) عند بناء تطبيق باستخدام Entity Framework Core ، من الأفضل أن تتبع أسلوب فصل الطبقات (Layered Architecture) لتقسيم المشروع إلى أجزاء منظمة وقابلة للصيانة. 🔹 ما معنى فصل الطبقات؟ فصل الطبقات يعني تقسيم المشروع إلى أجزاء (Projects أو Folders) بناءً على الوظيفة، بحيث كل طبقة تكون مسؤولة عن جزء معين من التطبيق، مما يجعل الكود أنظف وأسهل في التوسعة والصيانة. 🔸 الطبقات الأساسية في مشروع EF Core اسم الطبقة الوصف ملاحظات Entities / Models تحتوي على الكلاسات التي تمثل جداول قاعدة البيانات. تُستخدم من قبل جميع الطبقات الأخرى. Data Access Layer (DAL) تحتوي على DbContext وجميع عمليات الوصول إلى البيانات. قد تتضمن Repositories. Business Logic Layer (BLL) تحتوي على منطق المعالجة والقيود الخاصة بالتطبيق. قد تستدعي DAL داخليًا. Presentation Layer (U...

Entity Framework - الفرق بين Code First وDatabase First وModel First

Entity Framework - الفرق بين Code First وDatabase First وModel First عند استخدامك لـ Entity Framework (سواء EF6 أو EF Core)، يمكنك البدء بمشروعك بأحد ثلاث طرق رئيسية لتوليد الكود وربطه بقاعدة البيانات. كل طريقة تناسب سيناريو مختلف من التطوير. دعونا نستعرض الفرق بينها: 🔹 أولًا: Code First في هذه الطريقة، تبدأ بكتابة الكود (الكلاسات - Classes) في C#، ثم يتم توليد قاعدة البيانات تلقائيًا منها باستخدام EF. ✅ المميزات: تحكم كامل في الكود والبنية. مناسب للتطبيقات الجديدة. دعم قوي للمهاجرات (Migrations). ❌ العيوب: قد لا يكون مثاليًا إذا كانت قاعدة البيانات موجودة بالفعل. 🔧 مثال مبسط: public class Student { public int Id { get; set; } public string Name { get; set; } } ثم باستخدام Migrations: يتم إنشاء قاعدة البيانات تلقائيًا. 🔹 ثانيًا: Database First في هذه الطريقة، تبدأ من قاعدة بيانات موجودة، ويتم توليد الكود تلقائيًا منها (Entities وDbContext). ✅ المميزات: سهل إذا كانت قاعدة البيانات موجودة مسبقًا. يتم توليد الكود بشكل...

Entity Framework - ما هو ORM؟ ونبذة عن Dapper وNHibernate

Entity Framework - ما هو ORM؟ ونبذة عن Dapper وNHibernate ORM هي اختصار لـ Object-Relational Mapping ، وتعني "الربط الكائني العلاقي". ببساطة، هي تقنية تُستخدم لربط الكائنات (Objects) في الكود مع الجداول (Tables) في قاعدة البيانات. 🔹 لماذا نحتاج إلى ORM؟ بدون ORM، نحتاج إلى كتابة استعلامات SQL يدوية والتعامل مع الكائنات بأنفسنا. بينما ORM توفر لنا طبقة وسيطة تقوم بتحويل الكود الكائني إلى استعلامات SQL تلقائيًا، والعكس أيضًا. 🔹 مزايا ORM تسريع التطوير. تقليل كمية الكود المكتوب. سهولة التعامل مع البيانات بشكل كائني. دعم التحقق من النوع (Type Checking) في وقت البرمجة. 🔹 عيوب ORM أداء أقل من SQL اليدوي في العمليات المعقدة. بعض المرونة تضيع بسبب التجريد العالي. 🔸 مقارنة بين EF Core وDapper وNHibernate التقنية النوع السهولة الأداء الدعم والانتشار Entity Framework Core ORM كامل سهل ومتكامل مع .NET متوسط مرتفع (مدعوم من Microsoft) ...

Entity Framework -متى تستخدم كل واحدة منهما؟

9.9 Entity Framework - متى تستخدم كل واحدة منهما؟ بعد أن فهمنا مميزات وعيوب كل من Data Annotations و Fluent API ، يأتي السؤال المهم: متى نستخدم كل طريقة؟ في هذا الدرس سنتعرف على أفضل السيناريوهات لاستخدام كل منهما حسب طبيعة المشروع وحجمه وتعقيده. 🔹 متى تستخدم Data Annotations؟ في المشاريع الصغيرة أو النماذج الأولية (Prototypes): حيث تكون الحاجة لضبطات بسيطة وسريعة. عندما تكون العلاقات والبيانات غير معقدة: مثل تطبيق CRUD بسيط بدون علاقات مركبة أو شروط متقدمة. إذا كان الفريق صغيرًا أو يعمل بسرعة: حيث يكون الاهتمام الأكبر بسرعة التطوير أكثر من تعقيد البنية. للمبتدئين: الذين يتعلمون Entity Framework لأول مرة ويريدون التدرج في الفهم قبل الانتقال لضبط أعقد. 🔹 متى تستخدم Fluent API؟ في المشاريع الكبيرة والمتوسطة: حيث توجد جداول كثيرة وعلاقات معقدة وقواعد بيانات ضخمة. عندما تحتاج لضبط مفاتيح مركبة (Composite Keys): أو جداول وسيطة (Join Tables) أو علاقات مخصصة. إذا كنت تريد فصل الضبط عن الكود الأساسي: لتجعل الكيانات (Entities) نظيفة وخا...

Entity Framework -مميزات وعيوب كل طريقة.

9.8 Entity Framework - مميزات وعيوب كل طريقة (Fluent API vs Data Annotations) في Entity Framework Core، يمكننا ضبط الكيانات باستخدام طريقتين رئيسيتين: Data Annotations أو Fluent API . كل طريقة لها مميزاتها وعيوبها، واختيار الأنسب يعتمد على طبيعة المشروع ومتطلباته. 🔹 مميزات Data Annotations سهولة الاستخدام: كتابة أقل وأسهل للفهم خاصة للمبتدئين. توفير الوقت: يمكنك ضبط الكيانات بسرعة عبر السمات فوق الخصائص مباشرة. مثالية للمشاريع الصغيرة: إذا كان المشروع بسيطًا أو متوسطًا ولا يحتوي على علاقات معقدة. 🔹 عيوب Data Annotations محدودية التحكم: لا تدعم جميع أنواع الضبط، خاصة العلاقات المعقدة والفهارس متعددة الأعمدة. تشويش الكود: كثرة السمات قد تجعل كود الكيان مزدحمًا وغير نظيف. صعوبة التعديل لاحقًا: تعديل الخصائص يتطلب تعديل الكيانات نفسها مما قد يؤثر على الكود الحالي. 🔹 مميزات Fluent API مرونة كاملة: يمكنك ضبط كل شيء بدقة (العلاقات، الفهارس، القيم الافتراضية، المفاتيح المركبة، إلخ). فصل الإعدادات عن الكيانات: الكيانات تظل نظيفة ...

Entity Framework - Fluent API Complex Types (Owned Entities)

9.7 Entity Framework - شرح Complex Types (Owned Entities) في بعض الأحيان، نحتاج إلى تخزين مجموعة خصائص مرتبطة ببعضها في نفس الجدول بدون إنشاء جدول منفصل لها. هنا يظهر مفهوم Owned Entities أو ما يُعرف أحيانًا بـ Complex Types ، وهي ميزة قوية جدًا في Entity Framework Core. 🔹 ما هو Owned Entity؟ Owned Entity هو كيان (Entity) يتم ربطه بشكل كامل بكائن آخر (المالك - Owner)، ويتم تخزين خصائصه داخل نفس جدول الكائن المالك، وليس في جدول مستقل. بمعنى آخر: - لا يتم إنشاء جدول جديد للـ Owned Entity. - يتم دمج خصائصه مع خصائص الكيان الأساسي في نفس الجدول. 🔹 مثال عملي على Owned Entities افترض لدينا كيان Customer يحتوي على عنوان Address مكوّن من عدة خصائص مثل: Street وCity وCountry. // الكلاس المملوك public class Address { public string Street { get; set; } public string City { get; set; } public string Country { get; set; } } // الكيان الرئيسي public class Customer { public int Id { get; set; } public string Name { get; set; } public Addr...

Entity Framework - Fluent API إنشاء الفهارس باستخدام HasIndex()

9.6 Entity Framework - إنشاء الفهارس باستخدام HasIndex() العمل مع قواعد البيانات الكبيرة يتطلب تحسين أداء الاستعلامات، وأحد أهم وسائل تحسين الأداء هو إنشاء الفهارس (Indexes) على الأعمدة. في Entity Framework Core، باستخدام Fluent API ، يمكنك إنشاء الفهارس بسهولة باستخدام الدالة HasIndex() . 🔹 ما هو الفهرس (Index) في قواعد البيانات؟ الفهرس عبارة عن هيكل بيانات يُستخدم لتسريع عمليات البحث والاستعلام عن السجلات داخل الجداول. وجود الفهرس يجعل عملية البحث عن قيمة معينة أسرع بكثير مقارنة بالبحث بدون فهرس. 🔹 كيفية إنشاء فهرس باستخدام HasIndex() يمكنك إنشاء فهرس على عمود معين أو مجموعة من الأعمدة باستخدام HasIndex() داخل OnModelCreating . protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Product>(entity => { entity.HasIndex(p => p.Name); }); } في هذا المثال سيتم إنشاء فهرس على عمود Name في جدول Products لتحسين عمليات البحث عن الأسماء. 🔹 إنشاء فهرس مركب (Composite Index) يمكنك إنشاء ف...

Entity Framework - Fluent API ضبط الجدااول والعلاقات

9.5 Entity Framework - ضبط الجداول والعلاقات باستخدام ToTable(), HasOne().WithMany(), HasMany().WithOne() في Entity Framework Core باستخدام Fluent API ، يمكننا ضبط أسماء الجداول (Tables) والتحكم الكامل بالعلاقات (Relationships) بين الكيانات بطريقة دقيقة ومنظمة. في هذا الدرس سنتعلم كيف نستخدم الدوال ToTable() ، HasOne().WithMany() ، و HasMany().WithOne() . 🔹 ToTable() - تخصيص اسم الجدول تُستخدم الدالة ToTable() لتحديد اسم الجدول في قاعدة البيانات بشكل صريح بدلاً من الاعتماد على اسم الكيان (Entity) بشكل افتراضي. modelBuilder.Entity<Product>() .ToTable("tbl_Products"); هنا سيتم إنشاء أو ربط الكيان Product مع جدول اسمه tbl_Products في قاعدة البيانات. 🔹 HasOne().WithMany() - تعريف علاقة One-to-Many تُستخدم لتعريف علاقة بين كيانين حيث أن كيانًا واحدًا يرتبط بالعديد من الكيانات الأخرى (مثل: كل Customer له العديد من Orders). مثال عملي: modelBuilder.Entity<Order>() .HasOne(o => o.Customer) .WithMany(c => c.Orders) ...

Entity Framework - Fluent API 0 التحكم في خصائص الأعمدة باستخدام

9.4 Entity Framework - التحكم في خصائص الأعمدة باستخدام HasMaxLength(), IsRequired(), HasColumnName(), HasDefaultValue() باستخدام Fluent API في Entity Framework Core، يمكنك التحكم الكامل في خصائص الأعمدة (Columns) داخل الجداول. توفر لك Fluent API وظائف مثل HasMaxLength() ، IsRequired() ، HasColumnName() ، و HasDefaultValue() لضبط كل تفاصيل العمود بطريقة احترافية. 🔹 HasMaxLength() - تحديد الطول الأقصى للنصوص تُستخدم لتحديد الحد الأقصى لعدد الأحرف التي يمكن تخزينها في عمود نصي (String Column). modelBuilder.Entity<Product>(entity => { entity.Property(p => p.Name) .HasMaxLength(100); }); هنا لن يقبل العمود أكثر من 100 حرف داخل الخاصية Name . 🔹 IsRequired() - جعل العمود إلزاميًا (NOT NULL) تُستخدم لجعل العمود لا يقبل القيم الفارغة (Null) ويصبح مطلوبًا في قاعدة البيانات. modelBuilder.Entity<Product>(entity => { entity.Property(p => p.Name) .IsRequired(); }); بهذا الشكل، العمود Name لن يقبل قيمًا فارغ...

Entity Framework - Fluent API المفاتيح الأساسية HasKey()

9.3 Entity Framework - المفاتيح الأساسية باستخدام HasKey() في Entity Framework Core، يعتبر المفتاح الأساسي (Primary Key) جزءًا أساسيًا لكل جدول. من خلال Fluent API ، نستخدم الدالة HasKey() لتعريف المفاتيح الأساسية سواء كانت مفتاحًا واحدًا (Single Key) أو مفتاحًا مركبًا (Composite Key). 🔹 ما هي وظيفة HasKey()؟ تُستخدم الدالة HasKey() لتعريف الخاصية أو مجموعة الخصائص التي تشكل المفتاح الأساسي (Primary Key) للكيان (Entity) في قاعدة البيانات. يجب أن يكون لكل كيان مفتاح أساسي حتى يتمكن EF Core من تتبعه والتعامل معه داخل قاعدة البيانات. 🔹 كيفية استخدام HasKey() مع مفتاح أساسي مفرد protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Product>(entity => { entity.HasKey(p => p.Id); }); } هنا حددنا أن الخاصية Id هي المفتاح الأساسي للكيان Product . 🔹 كيفية استخدام HasKey() مع مفتاح أساسي مركب (Composite Key) في بعض الأحيان نحتاج إلى مفتاح أساسي يتكون من أكثر من خاصية، مثل: OrderId وProduct...

Entity Framework - Fluent API متى نحتاجه ولماذا يعتبر أقوى من Data Annotations؟

9.2 Entity Framework - متى نحتاج Fluent API ولماذا يعتبر أقوى من Data Annotations؟ Fluent API يوفر لك تحكمًا أدق وأوسع مقارنة باستخدام Data Annotations . في هذا الدرس سنفهم متى نحتاج لاستخدام Fluent API ولماذا يعتبر أقوى وأشمل من Data Annotations، خاصة في المشاريع الكبيرة والمعقدة. 🔹 متى نحتاج استخدام Fluent API؟ عند الحاجة لضبط علاقات معقدة: مثل وجود أكثر من علاقة بين كيانين أو تخصيص سلوك العلاقات (Cascade Delete، مثلاً). عند التعامل مع كيانات لا يمكن تعديلها: مثل الكيانات القادمة من مكتبات خارجية (External Libraries). عند تخصيص خصائص متقدمة: مثل تعيين دقة الأرقام، إنشاء فهارس متعددة الأعمدة، أو تغيير أسماء الجداول والأعمدة بطريقة ديناميكية. عند الرغبة في عزل الإعدادات: بحيث يكون كود الضبط (Configuration) منفصل عن كود الكيانات لزيادة تنظيم المشروع. عند الحاجة لضبط Owned Types أو Complex Types: وهي كيانات مملوكة لا يتم إنشاؤها كجداول منفصلة. 🔹 لماذا يعتبر Fluent API أقوى من Data Annotations؟ مرونة كاملة: تستطيع ضبط أي خاصية أو علاقة أو ...

Entity Framework - Fluent API ما هو؟

9.1 Entity Framework - ما هو Fluent API؟ عند العمل مع Entity Framework Core، نحتاج أحيانًا إلى ضبط الكيانات (Entities) بطريقة أكثر تفصيلًا ومرونة مما توفره Data Annotations . هنا يأتي دور Fluent API ، وهي طريقة متقدمة لضبط كل تفاصيل بناء قاعدة البيانات باستخدام أسلوب برمجي (برمجة متسلسلة - Fluent Style) داخل كلاس الـ DbContext . 🔹 تعريف Fluent API Fluent API هي مجموعة من الدوال البرمجية التي يتم استخدامها داخل دالة OnModelCreating في كلاس DbContext لضبط خصائص الكيانات والجداول والعلاقات بدقة متناهية. بدلًا من استخدام Attributes فوق الخصائص أو الكلاسات، يتم استخدام سلسلة أوامر Fluent API لضبط كل شيء بطريقة أكثر تفصيلًا وقابلية للتحكم. 🔹 مثال بسيط على Fluent API using Microsoft.EntityFrameworkCore; public class AppDbContext : DbContext { public DbSet<Product> Products { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Product>(entity => { entity.Has...

Entity Framework - Data Annotation كيف تتفادى الأخطاء المعروفة؟

8.9 Entity Framework - كيف تتفادى الأخطاء المعروفة عند استخدام Data Annotations؟ استخدام Data Annotations في Entity Framework Core طريقة قوية لضبط الكيانات، لكنها قد تؤدي إلى بعض الأخطاء الشائعة إذا لم ننتبه لبعض التفاصيل. في هذا الدرس سنعرض أهم الأخطاء التي قد تقع فيها، وكيفية تجنبها بشكل احترافي. 🔹 1️⃣ نسيان تعيين المفتاح الأساسي [Key] إذا لم تحدد خاصية كمفتاح أساسي، قد يرفض EF Core إنشاء الجدول أو يُنشئ الجدول بدون مفتاح أساسي مما يسبب مشاكل في العمليات الأساسية مثل Update وDelete. // ✅ تأكد من وجود [Key] public class Product { [Key] public int Id { get; set; } } 🔹 2️⃣ استخدام [Required] على أنواع قيمة (Value Types) لا حاجة لاستخدام [Required] مع أنواع القيمة مثل int أو decimal، لأنها بطبيعتها لا تقبل القيمة Null. الاستخدام الصحيح يكون فقط مع أنواع المرجع (Reference Types) مثل string أو كائنات أخرى. // ❌ خطأ: لا داعي لوضع [Required] على int [Required] public int Quantity { get; set; } // ✅ صحيح: ضع [Required] على string [Required] public ...

Entity Framework - Data Annotation خصائص متقدمة [NotMapped]، [ConcurrencyCheck]، [Timestamp]، [Index].

8.8 Entity Framework - خصائص متقدمة [NotMapped]، [ConcurrencyCheck]، [Timestamp]، [Index] بالإضافة إلى السمات الأساسية في Data Annotations ، يوفر Entity Framework Core مجموعة من الخصائص المتقدمة التي تمنحنا تحكمًا إضافيًا في الكيانات وقواعد البيانات، مثل: [NotMapped] ، [ConcurrencyCheck] ، [Timestamp] ، و [Index] . 🔹 [NotMapped] - تجاهل الخاصية من التتبع تُستخدم خاصية [NotMapped] لإعلام EF Core أن هذه الخاصية لا يجب أن يتم إنشاؤها كعمود في قاعدة البيانات. using System.ComponentModel.DataAnnotations.Schema; public class Product { public int Id { get; set; } public string Name { get; set; } [NotMapped] public string ComputedValue { get; set; } } في هذا المثال، الخاصية ComputedValue ستظل موجودة داخل الكود ولكن لن يتم إنشاء عمود لها في قاعدة البيانات. 🔹 [ConcurrencyCheck] - التحقق من التزامن تُستخدم خاصية [ConcurrencyCheck] لضمان أن السجل لم يتم تعديله بواسطة مستخدم آخر أثناء تعديلك له. إذا تغيرت القيمة في قاعدة البيانات أثناء تعديلك،...

Entity Framework - Data Annotation التحكم بالعلاقات باستخدام [ForeignKey]، [InverseProperty].

8.7 Entity Framework - التحكم بالعلاقات باستخدام [ForeignKey] و[InverseProperty] عند العمل مع علاقات الجداول (Tables Relationships) في Entity Framework Core، قد نحتاج أحيانًا لتحديد العلاقات بشكل صريح وواضح. هنا يأتي دور سمتي [ForeignKey] و [InverseProperty] لضبط العلاقات بين الكيانات (Entities) بطريقة دقيقة ومنظمة. 🔹 [ForeignKey] - تحديد المفتاح الأجنبي (Foreign Key) تُستخدم خاصية [ForeignKey] لتحديد الخاصية التي تمثل المفتاح الأجنبي (Foreign Key) لربط كيان بكيان آخر. مثال عملي: using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; public class Order { [Key] public int Id { get; set; } public int CustomerId { get; set; } [ForeignKey("CustomerId")] public Customer Customer { get; set; } } public class Customer { [Key] public int Id { get; set; } public string Name { get; set; } } هنا الكلاس Order يحتوي على خاصية CustomerId ، وتم ربطها صراحةً بالكلاس Customer باستخد...

Entity Framework - Data Annotation تخصيص الجداول والأعمدة باستخدام [Table]، [Column]

8.6 Entity Framework - تخصيص الجداول والأعمدة باستخدام [Table] و[Column] بشكل افتراضي، يقوم Entity Framework Core بإنشاء أسماء الجداول والأعمدة في قاعدة البيانات بناءً على أسماء الكيانات (Entities) والخصائص (Properties). ولكن أحيانًا نحتاج إلى تخصيص هذه الأسماء أو تغيير بعض الخصائص المرتبطة بها، وهنا نستخدم السمات [Table] و [Column] . 🔹 [Table] - تخصيص اسم الجدول تُستخدم خاصية [Table] لتحديد اسم مختلف للجدول في قاعدة البيانات بدلاً من الاعتماد على اسم الكيان نفسه. مثال عملي: using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; [Table("tbl_Products")] public class Product { [Key] public int Id { get; set; } public string Name { get; set; } } هنا سيتم إنشاء أو ربط الكيان Product بالجدول tbl_Products بدلًا من "Products". 🔹 [Column] - تخصيص اسم العمود أو خصائصه تُستخدم خاصية [Column] لتحديد اسم مخصص للعمود أو لتحديد نوع البيانات في قاعدة البيانات. مثال عملي: public clas...

Entity Framework - Data Annotations [Key]، [Required]، [MaxLength]، [StringLength].

8.5 Entity Framework - شرح [Key]، [Required]، [MaxLength]، [StringLength] في هذا الدرس سنتعرف على أهم وأشهر سمات Data Annotations التي تستخدم مع الكيانات (Entities) في Entity Framework Core، وهي: [Key] ، [Required] ، [MaxLength] ، و [StringLength] . 🔹 [Key] - تعريف المفتاح الأساسي تُستخدم خاصية [Key] لتحديد أن هذا الحقل هو المفتاح الأساسي (Primary Key) للجدول في قاعدة البيانات. using System.ComponentModel.DataAnnotations; public class Product { [Key] public int ProductId { get; set; } public string Name { get; set; } } في هذا المثال، خاصية ProductId ستكون المفتاح الأساسي للجدول. 🔹 [Required] - جعل الخاصية إلزامية تُستخدم خاصية [Required] لجعل قيمة الخاصية إلزامية (أي لا تقبل القيم الفارغة Null). using System.ComponentModel.DataAnnotations; public class Product { [Key] public int Id { get; set; } [Required] public string Name { get; set; } } بدون تحديد [Required] ، يمكن أن يسمح EF Core بحفظ سجلات بدون اسم. 🔹 [M...