נחבר את מחלקת Animal למסד SQLite באמצעות EF Core. ניצור טבלה ונציג באתר את הרשומות שנקראות ממנה.
הפרק הקודם: 14 — מקום לשיעור נוסף · הפרק הבא: 16 — מוסיפים חיה ובודקים קלט
במסך מגע אפשר להחליק ימינה לפרק הבא ושמאלה לפרק הקודם.
מה נלמד
- להסביר את הרצף 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
הפקודה migrations add InitialAnimals יוצרת בתיקיית Migrations שני קבצים ששמותיהם מתחילים בתאריך ובשעה ומסתיימים ב־_InitialAnimals.cs וב־_InitialAnimals.Designer.cs. המספר בתחילת השם יהיה שונה בכל יצירה — זה תקין. השאירו את השמות ואת מזהה המיגרציה כפי שנוצרו אצלכם; אין לשנות אותם כדי להתאים לצילום או לדוגמה. בנוסף נוצר AppDbContextModelSnapshot.cs, שמתאר את מבנה המודל הנוכחי.
לאחר database update, בדקו שנוצר App.db בתיקיית הפרויקט. שמרו ב־Git את קובצי Migrations; מסד הנתונים המקומי נשאר מחוץ למאגר, לפי .gitignore.
השינויים בקוד
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
בקובץ הקיים בצעו את השינוי הבא. סימני + ו־- מציינים שינוי ואינם חלק מהקוד:
+using Microsoft.EntityFrameworkCore;
+using RazorTaba.Data;
+
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
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();
RazorTaba/Pages/Animals/Index.cshtml.cs
בקובץ הקיים בצעו את השינוי הבא. סימני + ו־- מציינים שינוי ואינם חלק מהקוד:
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
בקובץ הקיים בצעו את השינוי הבא. סימני + ו־- מציינים שינוי ואינם חלק מהקוד:
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 יכול לעזור להבין הודעת שגיאה ולנפות תקלה. אתם אחראים לכתוב, לבדוק ולהסביר את הקוד; אין להפעיל סוכן שיכתוב את הפרויקט.