什么是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為例。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

Product表包含以下字段。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

 

創(chuàng)建Console Application

我們?yōu)榱朔奖愫?jiǎn)單點(diǎn),這里我們創(chuàng)建一個(gè)Console Application程序。

VS中選擇創(chuàng)建一個(gè)Console Application程序。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

 

創(chuàng)建ADO.NET Entity Data Model

這里我們選擇ADO.NET Entity Data Model,命名為Product,后綴為.edmx文件。

 移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

點(diǎn)擊Add按鈕,彈出下面的向?qū)Э?,選擇Generate from database,也就是我們需要的Database First模式。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

點(diǎn)擊Next按鈕,來到以下向?qū)Э蛑?,選擇我們之前創(chuàng)建的數(shù)據(jù)庫,并為這個(gè)Entity Connection命名為ProductContext。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

繼續(xù)點(diǎn)擊Next按鈕,來到以下向?qū)Э蛑?,選擇我們需要添加的表,并輸入一個(gè)Model Namespace。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

點(diǎn)擊Finish按鈕,創(chuàng)建成功后我們可以看到自動(dòng)安裝了EntityFramwork的參考引用,還有我們創(chuàng)建的名為Product.edmx的文件。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

雙擊打開Product.edmx文件,可以看到我們選擇的Product表也加載映射到了文件當(dāng)中。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

基本的CRUD操作

下面我們開始在控制臺(tái)程序里對(duì)Product表數(shù)據(jù)進(jìn)行簡(jiǎn)單CRUD操作,打開Program.cs文件,在Main方法里編寫CRUD代碼,這里我們插入兩條數(shù)據(jù)Product NameProduct AProduct B,修改Product NameProduct A的記錄,刪除Product NameProduct B的記錄。

代碼如下:

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

        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();
            }
        }

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

運(yùn)行代碼,效果如下圖。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

 

數(shù)據(jù)庫表變化、視圖、存儲(chǔ)過程等基本操作

我們?cè)陧?xiàng)目開發(fā)階段,有時(shí)候會(huì)遇到一些表后期需要加一些字段,那么我們來看看如果更新這些表的變化。

這里我們假如需要知道每個(gè)產(chǎn)品歸屬一個(gè)公司,那么我們需要新增一個(gè)公司Company表,并且在Product表新增一個(gè)CompanyID的字段,與Company表形成對(duì)應(yīng)。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

新增了一個(gè)Company表并且修改了Product表,接下來我們要更新我們的Entity Data Model。打開Product.edmx文件,右鍵單擊選擇Update Model from Database。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

在彈出的向?qū)Э蛑校謩e選擇Add我們新建的Company表和Refresh我們修改的Product表。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

點(diǎn)擊Finish按鈕。我們看到新建的Company表和修改的Product表都更新到了Model當(dāng)中。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

當(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ǔ)過程。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

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

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

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

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

接下來我們同樣打開Product.edmx文件,右鍵單擊選擇Update Model from Database。在向?qū)Э蛑羞x擇我們新建的視圖和存儲(chǔ)過程。
移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

點(diǎn)擊Finish按鈕,我們可以看到新建的視圖vProductAndCompany也更新到了Model中。

 移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

那么如何看到新增的存儲(chǔ)過程到哪里了,我們依舊打開Product.edmx文件,右鍵單擊選擇Model Browser。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

我們看到右側(cè)的Model BrowserFunction Imports下就是我們新增的存儲(chǔ)過程,雙擊打開圖中可以編輯它的名稱以及返回值類型等。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

接下來我們就可以來操作視圖以及存儲(chǔ)過程了。

首先,先準(zhǔn)備一些測(cè)試數(shù)據(jù),分別向Product表和Company表中插入一些數(shù)據(jù)。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

 -- 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)

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

接著,我們代碼實(shí)現(xiàn)調(diào)用存儲(chǔ)新增一條Product數(shù)據(jù),并且調(diào)用視圖顯示全部視圖數(shù)據(jù)。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

                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();

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

運(yùn)行程序,結(jié)果如下。
移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

 

另外,除了通過以上方式來對(duì)數(shù)據(jù)庫數(shù)據(jù)操作之外,當(dāng)然也可以直接用SQL命令。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

                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