Entity Framework 6 開發實戰 課程心得

什麼是Entity Framework?


• 微軟.Net平台的 O/RM 框架

• 減少資料存取的程式碼

• 透過 LINQ 自動產生 SQL 指令碼

• 透過「強型別」取得與操作物件資料

• 支援變更追蹤、資料識別、延遲載入

• 支援三種開發模型 (開發工作流程) – DB First, Model First, Code First

實務上和外面的培訓的EF課程都是以 DB First 為主,透過edmx檔案來達成資料映射。edmx 檔案是一種 XML 檔案,可定義概念模型、儲存體模型,並讓這兩種模型產生對應。 .edmx 檔也包含 ADO.NET 實體資料模型設計工具 (Entity Designer) 使用的資訊,以圖形方式呈現模型。

預設會以 Entity Designer 開啟 .edmx 檔案。 也可以使用 XML 編輯器開啟 .edmx 檔案

根據範例資料庫建立連線並產生EDMX

課程Table



var db = new ContosoUniversityEntities();
            //db.Database.Log = (msg) => Console.WriteLine(msg);        
            var c = from p in db.Course
                    select p;

            foreach (var item in c)
            {
                Console.WriteLine(item.Department.Name + "\t" + item.Title);
            }

            Console.Read();

列出所有課程名稱

檢閱部門資料表

新增部門名稱

db.Department.Add(new Department()
            {
                Budget=100,
                Name = "Robert",
                StartDate=DateTime.Now
            });
            db.SaveChanges();
        }

修改部門資料

var item = db.Department.Find(16);
            item.Name = "財務部";
            item.Budget = 5000;
            db.SaveChanges();

刪除部門

 var DeleteDept = db.Department.Find(15);
            db.Department.Remove(DeleteDept);
            db.SaveChanges();

新增部門和部門關聯的課程

 var dept = new Department()
            {
                Name = "酷奇資訊",
                Budget = 18000,
                StartDate = new DateTime(2019, 6, 1, 0, 0, 0)
            };

            dept.Course.Add(new Course()
            {
                Title = "ASP.NET MVC 5 開發實戰",
                Credits = 1,
                Department = dept
            });

            dept.Course.Add(new Course()
            {
                Title = "Angular 7 開發實戰",
                Credits = 1,
                Department = dept
            });

            db.Department.Add(dept);
            db.SaveChanges();

顯示EF所轉譯出來的SQL資訊

 db.Database.Log = (msg) => Console.WriteLine(msg);

延遲載入指令

db.Configuration.LazyLoadingEnabled = false;

關於 StoreGeneratedPattern 列舉類型

– None 表示並非伺服器所產生的值。此為預設值。

– Identity 在新增時會產生值,並在更新時保持不變

– Computed 在新增和更新時都會從資料庫伺服器產生值

Raw SQL Query

var txt = db.Database.SqlQuery<string>("select Title from Course").FirstOrDefault();

執行SQL 更新指令

db.Database.ExecuteSqlCommand("Update Course set title='Node.js 開發實戰' where CourseID=@p0", 9);

常見的 CRUD 資料操作 (Create, Read, Update, Delete) , EF 執行生命週期裡,都是透過 DbContext 操作 , 每個被取出的實體 (Entity) 都擁有 EntityState 實體狀態 , 變更追蹤 (Change Tracking) – DbContext 會自動追蹤實體狀態變更 (透過POCO代理物件)

– Unchanged – Added – Deleted – Modified – Detached

心得建議:

實務上太複雜的查詢,如需使用複雜的LinQ語法做Join的情況,應該避免使用EF,而使用View和 預存程序,降低資料處理的時間。