最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。
十年河東十年河西,莫欺少年窮
學無止境,精益求精
本篇旨在學習EF增刪改查四大操作
上一節講述了EF CodeFirst 創建數據庫,本節繼續引用上一節的相關類學習EF的CRUD操作
廢話少說,直接上要點,上一節中的模型類我作了如下修改:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; using System.Linq; using System.Web; namespace EF_Test.DAL { public class Student { [Key] public int Id { get; set; } [Required] [StringLength(10)] public string Name { get; set; }//姓名 [StringLength(2)] public string Sex { get; set; }//性別 [StringLength(20)] public string StudentNum { get; set; }//學號 } public class Course { [Key] public int Id { get; set; } [Required] [StringLength(20)] public string Name { get; set; }//課程名稱 } public class Score { [Key] public int Id { get; set; } public int StudentScore { get; set; }//學生分數 public int StudentID { get; set; }//學生ID public int CourseID { get; set; }//課程ID public virtual Student Student { get; set; }//virtual關鍵字修飾,用於延遲加載 提高性能 只有顯式調用時 屬性==對象 public virtual Course Course { get; set; }//virtual關鍵字修飾,用於延遲加載 提高性能 只有顯式調用時 屬性==對象 } public class StudentContext : DbContext { public StudentContext() : base("StudentContext")//指定連接字符串 { } public DbSet<Student> Students { get; set; } public DbSet<Course> Courses { get; set; } public DbSet<Score> Scores { get; set; } /// <summary> /// OnModelCreating方法中的modelBuilder.Conventions.Remove語句禁止表名稱正在多元化。如果你不這樣做,所生成的表將命名為Students、Courses和Enrollments。相反,表名稱將是Student、Course和Enrollment。開發商不同意關於表名稱應該多數。本教程使用的是單數形式,但重要的一點是,您可以選擇哪個你更喜歡通過包括或省略這行代碼的形式。 /// </summary> /// <param name="modelBuilder"></param> protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } } }
有了以上模型類,我們就可以創建一些測試數據了
新建一個StudentInitializer類如下:
public class StudentInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<StudentContext> { public void InitLoad(StudentContext context) { //添加學生 var studentList = new List<Student> { new Student{Name = "陳依依", Sex = "女", StudentNum = "081309201"}, new Student{Name = "戚永景", Sex = "女", StudentNum = "081309202"}, new Student{Name = "劉華麗", Sex = "女", StudentNum = "081309203"}, new Student{Name = "薛正欽", Sex = "男", StudentNum = "081309204"}, new Student{Name = "王松濤", Sex = "男", StudentNum = "081309205"}, new Student{Name = "王自龍", Sex = "男", StudentNum = "081309206"}, new Student{Name = "高其峰", Sex = "男", StudentNum = "081309207"}, new Student{Name = "陳欣欣", Sex = "女", StudentNum = "081309208"}, new Student{Name = "陳麗陽", Sex = "女", StudentNum = "081309209"} }; studentList.ForEach(s => context.Students.Add(s)); context.SaveChanges(); //添加課程 var courseList = new List<Course> { new Course{ Name="數據結構"}, new Course{ Name="計算機原理"}, new Course{ Name="網絡技術"} }; courseList.ForEach(s => context.Courses.Add(s)); context.SaveChanges(); //添加分數 var scoreList = new List<Score>() { new Score{ StudentID=1,CourseID=1,StudentScore=90}, new Score{ StudentID=2,CourseID=1,StudentScore=91}, new Score{ StudentID=3,CourseID=1,StudentScore=92}, new Score{ StudentID=4,CourseID=1,StudentScore=93}, new Score{ StudentID=5,CourseID=1,StudentScore=94}, new Score{ StudentID=6,CourseID=1,StudentScore=95}, new Score{ StudentID=7,CourseID=1,StudentScore=96}, new Score{ StudentID=8,CourseID=1,StudentScore=97}, new Score{ StudentID=9,CourseID=1,StudentScore=98} }; scoreList.ForEach(s => context.Scores.Add(s)); context.SaveChanges(); } }
根據上述類,我們就可以顯式調用initLoad方法,創建一些測試數據,有了這些測試數據,我們就可以進行EF增刪改查操作了。
如果您還沒能夠成功創建數據庫,請參考鄙人的上篇博客:EF CodeFirst 創建數據庫,關於創建數據庫的問題不作講述。嘻嘻
1、查詢數據:
1.1方法(循環加載並轉化為List<T>):
public ActionResult Index()//查詢學生數據 { List<Student> studentList = new List<Student>(); foreach (var student in db.Students) { studentList.Add(student); } return View(studentList); }
1.2方法(LINQ 查詢):
public ActionResult Index()//查詢學生數據 { var StudentQuery = from b in db.Students select b;//IEnumerable 類型 return View(StudentQuery); }
1.3方法(將DbSet<T>轉化為List<T>):
public ActionResult Index()//查詢學生數據 { return View(db.Students.ToList()); }
1.4方法(原生態查詢),在貼出代碼之前,我們先認知下DbSet<T>類型
由上圖可知:DbSet<T>繼承了IEnumerable類型,而我們知道LInq查詢的初始結果就是IEnumerable類型,所以:我們直接返回DBSet<T>類型也是可以的,因此:有了如下查詢:
public ActionResult Index()//查詢學生數據 { return View(db.Students); }
由上圖可知:Add代表增加一個實體,Remove代表刪除一個實體,Find代表根據主鍵查詢一個實體,在此:我們對此三種方法不作解釋,我們繼續尋找查詢方法:紅色標注最後一個SqlQuery方法如何用呢?
1.5方法(SqlQuery查詢)
public ActionResult Index()//查詢學生數據 { return View(db.Students.SqlQuery("select * from Student")); }
1.6方法(IQueryable查詢)注:根據上圖,DbSet<T>也繼承了這個東東,所以我們的查詢結果也可以以這個東東為類型
public ActionResult Index()//查詢學生數據 { using (StudentContext dv = new StudentContext()) { IQueryable<Student> query = dv.Students.Where(d => d.Name.Contains("王")); return View(query); } }
1.7方法(Find查詢),上述截圖我們看到Find(參數)方法,其實他是根據主鍵來進行查詢的,這個方法也很簡單,代碼如下:
/// <summary> /// Find 根據主鍵查詢 返回學生學號 /// </summary> /// <returns></returns> public string Index(int Id=1) { using (StudentContext dv = new StudentContext()) { return dv.Students.Find(Id).StudentNum; } }
至此:EF查詢的方法也就講的差不多了,下面我們來研究下刪除的用法,所謂刪除就是Remove(Tentity entity)方法和RemoveRange(IEnumerable<TEntity> entities)方法
2、刪除數據:根據上述Remove方法
2.1方法(刪除一個實體)
/// <summary> /// 刪除 /// </summary> /// <param name="Id"></param> /// <returns></returns> public string Index4(int Id = 9)//刪除Id為9的 陳麗陽 童鞋 { using (StudentContext dv = new StudentContext()) { Student mol=dv.Students.Find(Id); if (mol != null) { dv.Students.Remove(mol); dv.SaveChanges(); return "刪除成功"; } else { return "刪除失敗"; } } }
2.2方法(刪除實體集合) 上圖中的:RemoveRange(IEnumerable<TEntity> entities)方法
/// <summary> /// 刪除 /// </summary> /// <param name="Id"></param> /// <returns></returns> public string Index4(int Id = 9)//刪除姓王的童鞋 { using (StudentContext dv = new StudentContext()) { var studentMol = db.Students.Where(d => d.Name.Contains("王")); if (studentMol != null) { dv.Students.RemoveRange(studentMol); dv.SaveChanges(); return "刪除成功"; } else { return "刪除失敗"; } } }
到此:刪除也就講完了,下面我們繼續增加的方法:
3、增加(ADD方法和AddRange方法)
咱們繼續看上圖哈,其實Add方法的參數類型和Remove方法的參數類型一樣,AddRange方法的參數類型和RemoveRange方法的參數類型一樣,有了刪除的相關知識,想必增加的方法大家也都會寫了
3.1方法(Add方法)
/// <summary> /// Add /// </summary> /// <param name="Id"></param> /// <returns></returns> public string Index6()// { using (StudentContext dv = new StudentContext()) { Student mol = new Student() { Name="陳臥龍", Sex="男", StudentNum="081309099" }; dv.Students.Add(mol); dv.SaveChanges(); return "OK"; } }
3.2方法(AddRange方法)
/// <summary> /// AddRange /// </summary> /// <param name="Id"></param> /// <returns></returns> public string Index6()// { using (StudentContext dv = new StudentContext()) { var studentList = new List<Student> { new Student{Name = "陳大龍", Sex = "男", StudentNum = "081309211"}, new Student{Name = "陳小龍", Sex = "男", StudentNum = "081309212"} }; dv.Students.AddRange(studentList); dv.SaveChanges(); return "OK"; } }
到此為止增加的方法也就被我們KO了,下面最後一個Update方法,一貫的概念,在更新之前,必須先找到這個對象,然後在更新這個對象
4、Update方法:
/// <summary> /// 更新 /// </summary> /// <param name="Id"></param> /// <returns></returns> public string Index5(int Id = 1)//將Id等於1的人 姓名由陳依依 改成 陳二二 { using (StudentContext dv = new StudentContext()) { Student mol = dv.Students.Find(Id); if (mol != null) { mol.Name = "陳二二"; dv.SaveChanges(); return "更新成功"; } else { return "無值可更新"; } } }
至此:EF 增刪改查也就全部被我們KO了。
我們都知道數據庫連接執行相關操作後,我們要及時釋放數據庫資源,在此:參照MSDN上的方法:如下
/// <summary> /// 釋放數據庫資源 斷開連接 /// </summary> /// <param name="disposing"></param> protected override void Dispose(bool disposing) { db.Dispose(); base.Dispose(disposing); }
最後,謝謝大家的耐心閱讀,如果覺得還不錯,就給個贊吧!謝謝!
@陳臥龍的博客