最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。
十年河東十年河西,莫欺少年窮
學無止境,精益求精
本篇旨在學習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);
}
最後,謝謝大家的耐心閱讀,如果覺得還不錯,就給個贊吧!謝謝!
@陳臥龍的博客