什么是Entity Framework
Entity Framework是微軟以 ADO.NET 為基礎所發展出來的對象關系對應 (O/R Mapping) 解決方案。將數據存儲從域對象自動映射到關系型數據庫,讓開發人員節不需要編寫大量的數據訪問代碼,節省了數據庫訪問的代碼時間,對數據庫操作如同操作Object對象一樣省事。
Entity Framework在使用當中有3中模式,分別是Code First,Model First以及Database First。
由於我最早接觸的是Database First這種模式,所以首先我們就來了解一下Database First模式的基本用法。
創建一個數據庫
Database First顧名思意就是首先需要一個存在的數據庫,所以這里需要創建一個數據庫。
這里我們還是以Product為例。
Product表包含以下字段。
創建Console Application
我們為了方便簡單點,這里我們創建一個Console Application程序。
在VS中選擇創建一個Console Application程序。
創建ADO.NET Entity Data Model
這里我們選擇ADO.NET Entity Data Model,命名為Product,后綴為.edmx文件。
點擊Add按鈕,彈出下面的向導框,選擇Generate from database,也就是我們需要的Database First模式。
點擊Next按鈕,來到以下向導框中,選擇我們之前創建的數據庫,並為這個Entity Connection命名為ProductContext。
繼續點擊Next按鈕,來到以下向導框中,選擇我們需要添加的表,並輸入一個Model Namespace。
點擊Finish按鈕,創建成功后我們可以看到自動安裝了EntityFramwork的參考引用,還有我們創建的名為Product.edmx的文件。
雙擊打開Product.edmx文件,可以看到我們選擇的Product表也加載映射到了文件當中。
基本的CRUD操作
下面我們開始在控制台程序里對Product表數據進行簡單CRUD操作,打開Program.cs文件,在Main方法里編寫CRUD代碼,這里我們插入兩條數據Product Name為Product A和Product B,修改Product Name為Product A的記錄,刪除Product Name為Product B的記錄。
代碼如下:
static void Main(string[] args) { using (var productContext = new ProductContext()) { // Create Console.WriteLine("創建兩個Product. Product A and Product B."); var productList = new List<Product>{ new Product { ProductName = "Product A", Price = 10000, Count = 10, Description = "Description A" }, new Product { ProductName = "Product B", Price = 20000, Count = 20, Description = "Description B" } }; productContext.Product.AddRange(productList); productContext.SaveChanges(); Console.WriteLine("創建成功."); // Display Console.WriteLine("顯示當前所有Product."); var products = productContext.Product.ToList(); foreach (var item in products) { Console.WriteLine("{0} {1} {2} {3} {4}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description); } Console.WriteLine(); // Update Console.WriteLine("修改Product A為Product AAA."); var productUpdate = productContext.Product.Where(p => p.ProductName == "Product A").FirstOrDefault(); if (productUpdate != null) { productUpdate.ProductName = "Product AAA"; productContext.Entry(productUpdate).State = EntityState.Modified; productContext.SaveChanges(); Console.WriteLine("修改成功."); } // Display Console.WriteLine("顯示當前所有Product."); products = productContext.Product.ToList(); foreach (var item in products) { Console.WriteLine("{0} {1} {2} {3} {4}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description); } Console.WriteLine(); // Delete Console.WriteLine("刪除Product B."); var productDelete = productContext.Product.Where(p => p.ProductName == "Product B").FirstOrDefault(); if (productContext != null) { productContext.Product.Remove(productDelete); productContext.SaveChanges(); Console.WriteLine("刪除成功."); } // Display Console.WriteLine("顯示當前所有Product."); products = productContext.Product.ToList(); foreach (var item in products) { Console.WriteLine("{0} {1} {2} {3} {4}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description); } Console.ReadKey(); } }
運行代碼,效果如下圖。
數據庫表變化、視圖、存儲過程等基本操作
我們在項目開發階段,有時候會遇到一些表后期需要加一些字段,那么我們來看看如果更新這些表的變化。
這里我們假如需要知道每個產品歸屬一個公司,那么我們需要新增一個公司Company表,並且在Product表新增一個CompanyID的字段,與Company表形成對應。
新增了一個Company表並且修改了Product表,接下來我們要更新我們的Entity Data Model。打開Product.edmx文件,右鍵單擊選擇Update Model from Database。
在彈出的向導框中,分別選擇Add我們新建的Company表和Refresh我們修改的Product表。
點擊Finish按鈕。我們看到新建的Company表和修改的Product表都更新到了Model當中。
當我們在實際項目當中,有時候在做復雜的處理,比如需要更新多個表的內容,或者需要多個表聯合查詢的數據,我們可能更多的需要視圖和存儲過程來完成,那么這里我們看看如何加載視圖和存儲過程以及怎么調用它們。
首先我們簡單的建立一個視圖和一個存儲過程。
CREATE VIEW [dbo].[vProductAndCompany] AS SELECT dbo.Product.ProductID, dbo.Product.ProductName, dbo.Product.Count, dbo.Product.Price, dbo.Product.Description, dbo.Company.CompanyName FROM dbo.Product LEFT OUTER JOIN dbo.Company ON dbo.Product.CompanyID = dbo.Company.CompanyID GO
CREATE PROCEDURE [dbo].[spSaveOrUpdateProduct]( @ProductID int, @ProductName nvarchar(50), @Price decimal(18,2), @Count int, @Description nvarchar(max), @CompanyID int ) AS BEGIN declare @CurrentProductID int if exists(select ProductID from Product where ProductID=@ProductID) begin update Product set ProductName=@ProductName, Price=@Price, [Count]=@Count, [Description]=@Description, CompanyID=@CompanyID where ProductID=@ProductID set @CurrentProductID=@ProductID end else begin insert into Product(ProductName,Price,[Count],[Description],CompanyID) values(@ProductName,@Price,@Count,@Description,@CompanyID) set @CurrentProductID=cast(SCOPE_IDENTITY() as int); end select @CurrentProductID as [RowCount] END
接下來我們同樣打開Product.edmx文件,右鍵單擊選擇Update Model from Database。在向導框中選擇我們新建的視圖和存儲過程。
點擊Finish按鈕,我們可以看到新建的視圖vProductAndCompany也更新到了Model中。
那么如何看到新增的存儲過程到哪里了,我們依舊打開Product.edmx文件,右鍵單擊選擇Model Browser。
我們看到右側的Model Browser中Function Imports下就是我們新增的存儲過程,雙擊打開圖中可以編輯它的名稱以及返回值類型等。
接下來我們就可以來操作視圖以及存儲過程了。
首先,先准備一些測試數據,分別向Product表和Company表中插入一些數據。
-- Company insert into Company(CompanyName) values('Company A') insert into Company(CompanyName) values('Company B') insert into Company(CompanyName) values('Company C') -- Product insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product A',100000,10,'Description A',1) insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product B',200000,20,'Description B',2) insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product C',300000,30,'Description C',3) insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product D',100000,10,'Description D',1) insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product E',200000,20,'Description E',2)
接着,我們代碼實現調用存儲新增一條Product數據,並且調用視圖顯示全部視圖數據。
Console.WriteLine("顯示當前所有Product."); var products = productContext.vProductAndCompany.ToList(); foreach (var item in products) { Console.WriteLine("{0} {1} {2} {3} {4} {5}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description, item.CompanyName); } Console.WriteLine("新增一個Product.名為Product F"); var newProduct = new Product { ProductID = 0, ProductName = "Product F", Price = 30000, Count = 5, Description = "Description F", CompanyID = 1 }; var result = productContext.spSaveOrUpdateProduct(newProduct.ProductID, newProduct.ProductName, newProduct.Price, newProduct.Count, newProduct.Description, newProduct.CompanyID); foreach (int returnValue in result) { if (returnValue > 0) { Console.WriteLine("新增成功."); } } Console.WriteLine("顯示當前所有Product."); products = productContext.vProductAndCompany.ToList(); foreach (var item in products) { Console.WriteLine("{0} {1} {2} {3} {4} {5}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description, item.CompanyName); } Console.ReadKey();
運行程序,結果如下。
另外,除了通過以上方式來對數據庫數據操作之外,當然也可以直接用SQL命令。
var strQuery = "select ProductID,ProductName,Count,Price,Description,CompanyID from Product"; var products = productContext.Database.SqlQuery<Product>(strQuery).ToList(); Console.WriteLine("顯示當前Product集合數據."); foreach (var item in products) { Console.WriteLine("{0} {1} {2} {3} {4} {5}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description, item.CompanyID); } Console.WriteLine(); Console.WriteLine("更新Product F為Product FFF."); string newProductName = "Product FFF"; var strCommand = string.Format("update Product set ProductName='{0}' where ProductID=6", newProductName); var result = productContext.Database.ExecuteSqlCommand(strCommand); Console.WriteLine("更新成功."); Console.WriteLine(); products = productContext.Database.SqlQuery<Product>(strQuery).ToList(); Console.WriteLine("顯示更新后的Product集合數據."); foreach (var item in products) { Console.WriteLine("{0} {1} {2} {3} {4} {5}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description, item.CompanyID); } Console.ReadKey();
運行程序,結果如下。
這里我們簡單的列舉一下查詢和更新,其他操作類似,這里就不一一介紹了。
好了,本篇就先到此,希望對你有所幫助,謝謝!