ASP.Net MVC + Entity Framework Code First 1
הקדמה בפרק הזה יוצג שימוש בFirst EntityFramework Code עבור ה use case הבאים : ASP.Net MVC ASP.Net Web API ASP.Net MVC + Scaffolding הערה : Framework Entity הוצג קצרה בקורס "גישה למסדי נתונים ב. Net " 2
קונפגורצית פרויקט ASP.Net לעבודה עם EF בכל פרויקט בו נשתמש בFramework Entity יש לבצע פעם אחת בפרויקט דרך Visual Studio : Tools->NuGet Package Manager->Package Manager Console PM> Enable-Migrations לעשות בפרויקט עם User Authentication אחרת הsetup מורכב יותר 3
דוגמא פרויקט Blogs עם ASP.Net MVC ניצור פרויקט ASP.Net כולל User Authentication כי זה נוח מבחינת יצירה אוטומטית של הdatabase ונבחר MVC ונבצע Tools->NuGet Package Manager->Package Manager Console נוסיף בספרית Models שני קבצים : blog.cs וכן post.cs PM> Enable-Migrations קוד המקור מופיע כאן ואפשר לראות שם את ה ReadMe 4
Models - blog.cs public class Blog{ : Id קונבנציה לסימון primary key public long Id { get; set; }//primary key public string Title { get; set; } public virtual ICollection<Post> Posts { get; set; } } } אין הכרח להשתמש אבל זה יכול להיות נוח מאוד 5
public class Post{ Models - post.cs : Id קונבנציה לסימון primary key public long Id { get; set; }//primary key public string Title { get; set; } public string Content { get; set; } קונבנציה לסימון foreign key מכיל את שם המחלקה אליה מצביעים ואחרי זה Id public long BlogId { get; set; }//forign key public virtual Blog Blog { get; set; } } אין הכרח להשתמש בשדה הזה אבל זה יכול להיות נוח מאוד 6
יצוג הטבלאות דרך ApplicationDbContext נוסיף ל ApplicationDbContext את השדות הבאים public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } עם ההוספה הזו למחלקה ייווצרו שתי טבלאות בdatabase אחת בשם Blogs ושניה בשם Posts הדרך ליצור את את מסד הנתונים בפעם הראשונה מופיעה בשקף הבא 7
יצירת מסד נתונים פעם ראשונה בגישת Code First Tools->NuGet Package Manager->Package Manager Console PM> Add-Migration Initial PM> Update-Database כל פעם שעושים migration נוסף עם שינוי הmodel אז משתמשים בשם אחר לדוגמא Add-Migration AddSomeFieldToSomeClass לאחר הרצה ראשונה נראה בשקף הבא מה נוצר 8
הצגת מסד הנתונים שנוצר טבלה שנוצרה ומייצגת בלוגים. השדות זהים לשדות של המחלקה Blog טבלה שנוצרה ומייצגת פוסטים. השדות זהים לשדות של המחלקה Post 9
חשוב להבין שהטבלאות מיוצגת Posts, Blogs מיצוגות ב# C בעזרת המאפינים Blogs,Posts במחלקה.ApplicationDbContext חשוב להבין גישה לטבלאות בעזרת #C Blogs,Posts הם מסוג DbSet שיורש את IQueryable,IEnumerable אותם הכרנו בפרקים הקודמים. ניתן לגשת אל Blogs,Posts אחרי יצירת מופע של ApplicationDbContext ב Controller לאחר שינוי כמו : Delete Create, Update, יש לקרוא לפונקציה SaveChanges של המופע של ApplicationDbContext בController המתאים 10
הצגת בלוגים- Read public class BlogController : Controller{ ApplicationDbContext m_db = new ApplicationDbContext(); public ActionResult Index(){ IEnumerable<Blog> blogs = m_db.blogs; גישה לטבלה @using BlogsMVC_EF.Models.Models @model IEnumerable<Blog> @{ViewBag.Title = "Index";} <h2>blog Index</h2> <a href="/blog/create">add</a> return View(blogs);} protected override void Dispose(bool disposing){ if (disposing){m_db.dispose();} נדרש בגלל שDbContext הוא disposable @foreach (var item in Model){ } <p>@item.title</p> base.dispose(disposing);}} BlogController.cs Index.cshtml 11
יצירת בלוג - Create [HttpGet] public ActionResult Create(){return View();} [HttpPost] public ActionResult Create(string title){ if (!string.isnullorempty(title))// simple validation{ Blog blog = new Blog { Title = title }; m_db.blogs.add(blog); m_db.savechanges(); @{ ViewBag.Title = "Create"; } <form action="/blog/create" method="post"> <input type="text" name="title" required/> <input type="submit" value="add Blog" /> </form> return RedirectToAction("Index");} } return View(); חלק מקובץ BlogController.cs Create.cshtml 12
עריכה - Update בעריכה אפשר להעביר את המידע שהשתנה + id לאחר מציאת האיבר בעזרת לדוגמא FirstOrDefault אפשר לשנות לו את הערכים שהשתנו לאחר העריכה יש לבצע SaveChanges ראה גישה דומה בקורס "גישה למסדי נתונים ב. Net " בדוגמה של Update עם LINQ to SQL (רק ששם משתמשים בSubmitChanges וכאן ב ( SaveChanges 13
מחיקה - Delete במחיקה בדרך כלל מעבירים את ה id לאחר מציאת האיבר בעזרת ה id מוחקים אותו באמצעות לדוגמא Remove לאחר המחיקה יש לבצע SaveChanges ראה גישה דומה בקורס "גישה למסדי נתונים ב. Net " בדוגמה של Delete עם LINQ to SQL (רק ששם משתמשים בSubmitChanges וכאן ב ( SaveChanges 14