什么是Entity Framework
Entity Framework是微軟以 ADO.NET 為基礎(chǔ)所發(fā)展出來的對(duì)象關(guān)系對(duì)應(yīng) (O/R Mapping) 解決方案。將數(shù)據(jù)存儲(chǔ)從域?qū)ο笞詣?dòng)映射到關(guān)系型數(shù)據(jù)庫,讓開發(fā)人員節(jié)不需要編寫大量的數(shù)據(jù)訪問代碼,節(jié)省了數(shù)據(jù)庫訪問的代碼時(shí)間,對(duì)數(shù)據(jù)庫操作如同操作Object對(duì)象一樣省事。
Entity Framework在使用當(dāng)中有3中模式,分別是Code First,Model First以及Database First。
由于我最早接觸的是Database First這種模式,所以首先我們就來了解一下Database First模式的基本用法。
創(chuàng)建一個(gè)數(shù)據(jù)庫
Database First顧名思意就是首先需要一個(gè)存在的數(shù)據(jù)庫,所以這里需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫。
這里我們還是以Product為例。
Product表包含以下字段。
創(chuàng)建Console Application
我們?yōu)榱朔奖愫?jiǎn)單點(diǎn),這里我們創(chuàng)建一個(gè)Console Application程序。
在VS中選擇創(chuàng)建一個(gè)Console Application程序。
創(chuàng)建ADO.NET Entity Data Model
這里我們選擇ADO.NET Entity Data Model,命名為Product,后綴為.edmx文件。
點(diǎn)擊Add按鈕,彈出下面的向?qū)Э?,選擇Generate from database,也就是我們需要的Database First模式。
點(diǎn)擊Next按鈕,來到以下向?qū)Э蛑?,選擇我們之前創(chuàng)建的數(shù)據(jù)庫,并為這個(gè)Entity Connection命名為ProductContext。
繼續(xù)點(diǎn)擊Next按鈕,來到以下向?qū)Э蛑?,選擇我們需要添加的表,并輸入一個(gè)Model Namespace。
點(diǎn)擊Finish按鈕,創(chuàng)建成功后我們可以看到自動(dòng)安裝了EntityFramwork的參考引用,還有我們創(chuàng)建的名為Product.edmx的文件。
雙擊打開Product.edmx文件,可以看到我們選擇的Product表也加載映射到了文件當(dāng)中。
基本的CRUD操作
下面我們開始在控制臺(tái)程序里對(duì)Product表數(shù)據(jù)進(jìn)行簡(jiǎn)單CRUD操作,打開Program.cs文件,在Main方法里編寫CRUD代碼,這里我們插入兩條數(shù)據(jù)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("創(chuàng)建兩個(gè)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("創(chuàng)建成功."); // Display Console.WriteLine("顯示當(dāng)前所有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("顯示當(dāng)前所有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("顯示當(dāng)前所有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(); } }
運(yùn)行代碼,效果如下圖。
數(shù)據(jù)庫表變化、視圖、存儲(chǔ)過程等基本操作
我們?cè)陧?xiàng)目開發(fā)階段,有時(shí)候會(huì)遇到一些表后期需要加一些字段,那么我們來看看如果更新這些表的變化。
這里我們假如需要知道每個(gè)產(chǎn)品歸屬一個(gè)公司,那么我們需要新增一個(gè)公司Company表,并且在Product表新增一個(gè)CompanyID的字段,與Company表形成對(duì)應(yīng)。
新增了一個(gè)Company表并且修改了Product表,接下來我們要更新我們的Entity Data Model。打開Product.edmx文件,右鍵單擊選擇Update Model from Database。
在彈出的向?qū)Э蛑校謩e選擇Add我們新建的Company表和Refresh我們修改的Product表。
點(diǎn)擊Finish按鈕。我們看到新建的Company表和修改的Product表都更新到了Model當(dāng)中。
當(dāng)我們?cè)趯?shí)際項(xiàng)目當(dāng)中,有時(shí)候在做復(fù)雜的處理,比如需要更新多個(gè)表的內(nèi)容,或者需要多個(gè)表聯(lián)合查詢的數(shù)據(jù),我們可能更多的需要視圖和存儲(chǔ)過程來完成,那么這里我們看看如何加載視圖和存儲(chǔ)過程以及怎么調(diào)用它們。
首先我們簡(jiǎn)單的建立一個(gè)視圖和一個(gè)存儲(chǔ)過程。
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。在向?qū)Э蛑羞x擇我們新建的視圖和存儲(chǔ)過程。
點(diǎn)擊Finish按鈕,我們可以看到新建的視圖vProductAndCompany也更新到了Model中。
那么如何看到新增的存儲(chǔ)過程到哪里了,我們依舊打開Product.edmx文件,右鍵單擊選擇Model Browser。
我們看到右側(cè)的Model Browser中Function Imports下就是我們新增的存儲(chǔ)過程,雙擊打開圖中可以編輯它的名稱以及返回值類型等。
接下來我們就可以來操作視圖以及存儲(chǔ)過程了。
首先,先準(zhǔn)備一些測(cè)試數(shù)據(jù),分別向Product表和Company表中插入一些數(shù)據(jù)。
-- 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)
接著,我們代碼實(shí)現(xiàn)調(diào)用存儲(chǔ)新增一條Product數(shù)據(jù),并且調(diào)用視圖顯示全部視圖數(shù)據(jù)。
Console.WriteLine("顯示當(dāng)前所有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("新增一個(gè)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("顯示當(dāng)前所有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();
運(yùn)行程序,結(jié)果如下。
另外,除了通過以上方式來對(duì)數(shù)據(jù)庫數(shù)據(jù)操作之外,當(dāng)然也可以直接用SQL命令。
var strQuery = "select ProductID,ProductName,Count,Price,Description,CompanyID from Product"; var products = productContext.Database.SqlQuery<Product>(strQuery).ToList(); Console.WriteLine("顯示當(dāng)前Product集合數(shù)據(jù)."); 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 Pr http://www.cnblogs.com/mejoy/p/6475780.html