נחבר את מחלקת Animal למסד SQLite באמצעות EF Core. ניצור טבלה ונציג באתר את הרשומות שנקראות ממנה.
חזרה: מכרטיס HTML לאובייקט Animal
אם קישור הקוד אינו נפתח, בקשו גישה למאגר.
מה נלמד
- להסביר את הרצף Animal → DbSet → מיגרציה → טבלה.
- ליצור מסד ללא התקנת שרת SQL.
- לקרוא רשומות ולהבחין בין רשימה ריקה לבין תקלה.
מתחילים מסונכרנים
פתחו את תיקיית הפרויקט הנכונה, בדקו שאין שינוי לא שמור והפעילו Pull. אם Git מציג התנגשות, פנו למורה; אל תמחקו עבודה ואל תבצעו Force Push.
מה התפקיד של כל חלק?
Animal מתארת רשומה. AppDbContext מחבר את EF לטבלאות. DbSet הוא הגישה לטבלת Animals. מיגרציה היא תיאור שינוי במבנה; database update מחילה אותו על המסד המקומי. אין להשתמש ב־EnsureCreated לצד migrations.
הפרמטר db מספק לדף גישה למסד, לפי ההגדרה ב־Program. db.Animals פונה לרשומות החיות. await מחכה לסיום הקריאה לפני הצגת התוצאה. עקבו אחר הנתונים משורת הקריאה ועד ללולאה שבדף.
מריצים לפי הסדר
הפקודות יוצרות את המיגרציה אצלכם. קובצי המיגרציות נכנסים ל־Git; App.db אינו נכנס. בחזרה מהבית מבצעים Pull ואז dotnet ef database update --project RazorTaba אם התקבלו מיגרציות חדשות. אין לשתף מסד פעיל בין מחשבים דרך Git.
פקודות השלב
הפקודות מורצות משורש המאגר, שבו נמצאת התיקייה RazorTaba, בטרמינל של Visual Studio או VS Code.
dotnet add RazorTaba package Microsoft.EntityFrameworkCore.Sqlite --version 10.0.10
dotnet add RazorTaba package Microsoft.EntityFrameworkCore.Design --version 10.0.10
dotnet add RazorTaba package SQLitePCLRaw.bundle_e_sqlite3 --version 3.0.5
dotnet new tool-manifest
dotnet tool install dotnet-ef --version 10.0.10
dotnet ef migrations add InitialAnimals --project RazorTaba
dotnet ef database update --project RazorTaba
השינויים בקוד
RazorTaba/Data/AppDbContext.cs
קובץ חדש. צרו את RazorTaba/Data/AppDbContext.cs והדביקו את התוכן הבא:
using Microsoft.EntityFrameworkCore;
using RazorTaba.Models;
namespace RazorTaba.Data;
/// <summary>החיבור בין אובייקטי האתר לבין טבלאות מסד הנתונים.</summary>
public class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(options)
{
public DbSet<Animal> Animals => Set<Animal>();
}
RazorTaba/Program.cs
בקובץ הקיים בצעו את השינוי הבא. סימני + ו־- מציינים שינוי ואינם חלק מהקוד:
--- a/RazorTaba/Program.cs
+++ b/RazorTaba/Program.cs
@@ -1,8 +1,15 @@
+using Microsoft.EntityFrameworkCore;
+using RazorTaba.Data;
+
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSingleton<RazorTaba.Services.MarkdownRenderer>();
+// נתיב יחסי מחושב תמיד מתיקיית הפרויקט, גם כשמריצים פקודה משורש המאגר.
+string databasePath = Path.Combine(builder.Environment.ContentRootPath, "App.db");
+builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlite($"Data Source={databasePath}"));
+
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
RazorTaba/Pages/Animals/Index.cshtml.cs
בקובץ הקיים בצעו את השינוי הבא. סימני + ו־- מציינים שינוי ואינם חלק מהקוד:
--- a/RazorTaba/Pages/Animals/Index.cshtml.cs
+++ b/RazorTaba/Pages/Animals/Index.cshtml.cs
@@ -1,19 +1,18 @@
using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.EntityFrameworkCore;
+using RazorTaba.Data;
using RazorTaba.Models;
namespace RazorTaba.Pages.Animals;
-/// <summary>מציג כרטיסים מתוך אובייקטים של Animal.</summary>
-public class IndexModel : PageModel
+/// <summary>קורא חיות מהמסד בלי לשנות אותן.</summary>
+public class IndexModel(AppDbContext db) : PageModel
{
public List<Animal> Animals { get; private set; } = new();
- /// <summary>יוצר אובייקט לדוגמה לכל בקשה, ללא שמירה.</summary>
- public void OnGet()
+ /// <summary>טוען את הרשומות לפי שם לצורך תצוגה.</summary>
+ public async Task OnGetAsync()
{
- Animals = new List<Animal>
- {
- new Animal { Id = 1, Name = "נורי", Description = "שועל סקרן שאוהב ללמוד." }
- };
+ Animals = await db.Animals.AsNoTracking().OrderBy(a => a.Name).ToListAsync();
}
}
RazorTaba/Models/Animal.cs
בקובץ הקיים בצעו את השינוי הבא. סימני + ו־- מציינים שינוי ואינם חלק מהקוד:
--- a/RazorTaba/Models/Animal.cs
+++ b/RazorTaba/Models/Animal.cs
@@ -1,7 +1,7 @@
namespace RazorTaba.Models;
-/// <summary>חיה אחת באתר. בשלב זה האובייקטים קיימים רק בזיכרון.</summary>
+/// <summary>חיה אחת באתר, הנשמרת כרשומה בטבלת Animals.</summary>
public class Animal
{
public int Id { get; set; }
public string Name { get; set; } = "";
קבצי תשתית וקבצים שנוצרו אוטומטית
הקבצים הבאים נמצאים בקוד השלב. קבצים שנוצרים באמצעות פקודות השלב אין להעתיק ידנית.
מריצים ובודקים
- הפקודה database update מסתיימת ללא שגיאה.
- ב־/Animals מופיע מצב ריק ולא שגיאת שרת.
- נוצר App.db בתיקיית RazorTaba והוא אינו מופיע לשמירה ב־Git.
- שמרו את קובצי המיגרציה ב־commit.
משימה אישית ובדיקת הבנה
ציירו ב־Mermaid את הדרך ממחלקה לטבלה ולדף. הסבירו מה עובר ב־Git ומה נוצר בכל מחשב בנפרד.
בסיום שינוי משמעותי: בדקו את ה־diff, בצעו Stage, כתבו הודעת commit שמתארת מה שיניתם, ובצעו Push. ודאו ב־GitHub שהשינוי הגיע. נדרשים לפחות 50 commits משמעותיים לאורך השנה, גם למי שעובד תמיד באותו מחשב נייד.
AI יכול לעזור להבין הודעת שגיאה ולנפות תקלה. אתם אחראים לכתוב, לבדוק ולהסביר את הקוד; אין להפעיל סוכן שיכתוב את הפרויקט.