程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> EF CodeFirst增刪改查之‘CRUD’,codefirstcrud

EF CodeFirst增刪改查之‘CRUD’,codefirstcrud

編輯:關於.NET

EF CodeFirst增刪改查之‘CRUD’,codefirstcrud


   最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。

   十年河東十年河西,莫欺少年窮

   學無止境,精益求精

   本篇旨在學習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);
        }

   最後,謝謝大家的耐心閱讀,如果覺得還不錯,就給個贊吧!謝謝!

   @陳臥龍的博客

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved