1. 程式人生 > >2、ASP.NET MVC入門到精通——Entity Framework入門

2、ASP.NET MVC入門到精通——Entity Framework入門

實體框架(Entity Framework)簡介

簡稱EF

與ADO.NET關係

ADO.NET Entity Framework 是微軟以 ADO.NET 為基礎所發展出來的物件關係對應 (O/R Mapping) 解決方案,早期被稱為 ObjectSpace,最新版本是EF7【CodeOnly功能得到了更好的支援】

實體框架Entity Framework 是 ADO.NET 中的一組支援開發面向資料的軟體應用程式的技術。是微軟的一個ORM框架。

什麼是O/R Mapping

廣義上,ORM指的是面向物件的物件模型和關係型資料庫的資料結構之間的相互轉換。
狹義上,ORM可以被認為是,基於關係型資料庫的資料儲存,實現一個虛擬的面向物件的資料訪問介面。理想情況下,基於這樣一個面向物件的介面,持久化一個OO物件應該不需要要了解任何關係型資料庫儲存資料的實現細節。

 

ORM in EF

Entity Framework 利用了抽象化資料結構的方式,將每個資料庫物件都轉換成應用程式物件 (entity),而資料欄位都轉換為屬性 (property),關係則轉換為結合屬性 (association),讓資料庫的 E/R 模型完全的轉成物件模型,如此讓程式設計師能用最熟悉的程式語言來呼叫訪問。而在抽象化的結構之下,則是高度整合與對應結構的概念層、對應層和儲存層,以 及支援 Entity Framework 的資料提供者 (provider),讓資料訪問的工作得以順利與完整的進行。

  (1) 概念層:負責向上的物件與屬性顯露與訪問。

  (2) 對應層:將上方的概念層和底下的儲存層的資料結構對應在一起。

  (3) 儲存層:依不同資料庫與資料結構,而顯露出實體的資料結構體,和 Provider 一起,負責實際對資料庫的訪問和 SQL 的產生。

EDM  設計器

 

EF Demo演示

一、資料庫優先的方式

1、建立控制檯專案

 

2、建立資料庫(新增表)

 CREATE TABLE [dbo].[T_Customer](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [UserName] [nvarchar](32) NULL,
    [Age] [int] NULL,
    [Address] [nvarchar](64
) NULL, CONSTRAINT [PK_T_Customer] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]

3、  在專案中新增“資料實體模型”

 

點選下一步,選擇“從資料庫生成”

 

新建資料庫連線,

 

 

 

在程式碼中新增訪問上下文儲存到資料庫的程式碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EFDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            DemoSiteEntities entity = new DemoSiteEntities();
            T_Customer customer = new T_Customer { Address="東海五彩金輪",Age=27,UserName="楚留香"};
            entity.T_Customer.Add(customer); //這裡只相當於構造sql語句
            entity.SaveChanges(); //這裡才進行資料庫操作,相當於按F5執行
        }
    }
}

執行後,我們來看下資料庫中,已經插入了一條資料

 

發散思維:如果讓你實現一個ORM框架!

 

在EF中的實體資料模型(EDM)由以下三種模型和具有相應副檔名的對映檔案進行定義。

·   概念架構定義語言檔案 (.csdl) -- 定義概念模型。

·   儲存架構定義語言檔案 (.ssdl) -- 定義儲存模型

·   對映規範語言檔案 (.msl) -- 定義儲存模型與概念模型之間的對映M。

實體框架 使用這些基於 XML 的模型和對映檔案將對概念模型中的實體和關係的建立、讀取、更新和刪除操作轉換為資料來源中的等效操作。EDM 甚至支援將概念模型中的實體對映到資料來源中的儲存過程。

EF中操作資料庫的閘道器

ObjectContext封裝 .NET Framework 和資料庫之間的連線。此類用作“建立”、“讀取”、“更新”和“刪除”操作的閘道器。

ObjectContext 類為主類,用於與作為物件(這些物件為 EDM 中定義的實體型別的例項)的資料進行互動。

ObjectContext 類的例項封裝以下內容:

到資料庫的連線,以 EntityConnection 物件的形式封裝。

描述該模型的元資料,以 MetadataWorkspace 物件的形式封裝

用於管理快取中持久儲存的物件的 ObjectStateManager 物件

 

IQueryable介面與IEnumberable區別

IQueryable介面與IEnumberable介面的區別:  IEnumerable<T> 泛型類在呼叫自己的SKip 和 Take 等擴充套件方法之前資料就已經載入在本地記憶體裡了,而IQueryable<T> 是將Skip ,take 這些方法表示式翻譯成T-SQL語句之後再向SQL伺服器傳送命令。也是延遲在我要真正顯示資料的時候才執行。

 linq to ef中使用Ienumberable與Iqueryable的區別,要用到的SQL Server Profiler工具

Linq To EF

簡單查詢:

var result = from c in Entities.Customer select c;

條件查詢:

  普通linq寫法:

var result = from c in Entities.Customer where c.Gender ==‘w’ select c;

  Lambda表示式寫法: 

 var result = Entities.Customer.Where<Customer>(c =>c.Gender==‘w’);

  排序分頁寫法:

IQueryable<Customers> cust10 = (from c in customers
                                         orderby c.CustomerID
                                         select c).Skip(0).Take(10);

左外連線:可以的連線有Join 和 GroupJoin 方法。GroupJoin組聯接等效於左外部聯接,它返回第一個(左側)資料來源的每個元素(即使其他資料來源中沒有關聯元素)。

var query = from d in edm.Order_Details
                   join order in edm.Orders
                   on d.OrderID equals order.OrderID
                   select new
                    {
                        OrderId = order.OrderID,
                        ProductId = d.ProductID,
                        UnitPrice = d.UnitPrice
                     };

排序分頁:

IQueryable<Customers> cust10 = (from c in customers
                                         orderby c.CustomerID
                                         select c).Skip(0).Take(10);

聚合

可使用的聚合運算子有Average、Count、Max、Min 和 Sum。

using (var edm = new NorthwindEntities())
   {
       var maxuprice = edm.Products.Max(p => p.UnitPrice);
       Console.WriteLine(maxuprice.Value);
 }

連線

可以的連線有Join 和 GroupJoin 方法。GroupJoin組聯接等效於左外部聯接,它返回第一個(左側)資料來源的每個元素(即使其他資料來源中沒有關聯元素)。

using (var edm = new NorthwindEntities())
    {
       var query = from d in edm.Order_Details
                   join order in edm.Orders
                   on d.OrderID equals order.OrderID
                   select new
                    {
                        OrderId = order.OrderID,
                        ProductId = d.ProductID,
                        UnitPrice = d.UnitPrice
                     };

        foreach (var q in query)
         Console.WriteLine("{0},{1},{2}",q.OrderId,q.ProductId,q.UnitPrice);
}

不支援在查詢中引用非標量閉包(如實體)。在執行這類查詢時,會引發 NotSupportedException 異常,並顯示訊息“無法建立型別為“結束型別”的常量值。此上下文中僅支援基元型別(‘如 Int32、String 和 Guid’)

如下將會報異常的程式碼:

using (var edm = new NorthwindEntities())
 {
        Customers customer = edm.Customers.FirstOrDefault();
        IQueryable<string> cc = from c in edm.Customers
                                where c == customer
                                select c.ContactName;

         foreach (string name in cc)
               Console.WriteLine(name);
}

上面的程式碼中,由於customer是引用型別而不是Int32,String,Guid的標量型別,所以在執行到where c==customer這個地方時,會報異常。

var query = from c in db.Categories
         join p in db.Products
         on c.CategoryID equals p.CategoryID
         group new {c, p} by new {c.CategoryName} into g
         select new
         {
              g.Key.CategoryName,
              SumPrice = (decimal?)g.Sum(pt=>pt.p.UnitPrice),
              Count = g.Select(x=>x.c.CategoryID).Distinct().Count()
         };

延遲載入

延遲載入:又稱作懶載入。也就是Linq To EF並不是直接將資料查詢出來,而是要用到具體資料的時候才會載入到記憶體

Include是將關聯實體一塊載入

ToList等可以直接將資料載入到記憶體

使用機制的選擇

關於上下文使用注意事項

  • 不同的上下文例項來直接控制對應的實體
  • 實體只能由一個上下文跟蹤管理
  • EF上下文的ObjectStateMagner管理實體
  • 批量操作時提交資料庫的選擇
  • 延遲載入機制的選擇
  • 查詢Distinct的使用資料量大小適時的選擇是在記憶體中操作還是在資料庫中操作

EF 跨資料庫支援

目前已有數個數據庫廠商或元件開發商宣佈要支援 ADO.NET Entity Framework:

  (1) Core Lab,支援Oracle、MySQL、PostgreSQL 與 SQLite 資料庫。

  (2) IBM,實現 DB2 使用的 LINQ Provider。

  (3) MySQL,發展 MySQL Server 所用的 Provider。

  (4) Npqsql,發展 PostgreSQL 所用的 Provider。

  (5) OpenLink Software,發展支援多種資料庫所用的 Provider。

  (6) Phoenix Software International,發展支援 SQLite 資料庫的 Provider。

  (7) Sybase,將支援 Anywhere 資料庫。

  (8) VistaDB Software,將支援 VistaDB 資料庫。

  (9) DataDirect Technologies,發展支援多種資料庫所用的 Provider。

  (10) Firebird,支援 Firebird 資料庫。

相關推薦

2ASP.NET MVC入門精通——Entity Framework入門

實體框架(Entity Framework)簡介 簡稱EF 與ADO.NET關係 ADO.NET Entity Framework 是微軟以 ADO.NET 為基礎所發展出來的物件關係對應 (O/R Mapping) 解決方案,早期被稱為 ObjectSpace,最新版本是EF7【CodeOnly功能得

3ASP.NET MVC入門精通——Entity Framework增刪改查

這裡我接上講Entity Framework入門。從網上下載Northwind資料庫,新建一個控制檯程式,然後重新新增一個ado.net實體資料模型。 EF中操作資料庫的"閘道器"(操作上下文) DBContext封裝 .NET Framework 和資料庫之間的連線。此類用作“建立”、“讀取”、“更

19ASP.NET MVC入門精通——Unity

一、IOC介紹   IOC(Inversion of Control),中文譯為控制反轉,又稱為“依賴注入”(DI =Dependence Injection)   IOC的基本概念是:不建立物件,但是描述建立它們的方式。在程式碼中不直接與物件和服務連線,但在配置檔案中描述哪一個元件需要哪一項服務。容器負

6ASP.NET MVC入門精通——ASP.Net的兩種開發方式

目前,ASP.NET中兩種主流的開發方式是:ASP.NET Webform和ASP.NET MVC。從下圖可以看到ASP.NET WebForms和ASP.NET MVC是並行的,也就是說MVC不會取代WebForms(至少目前是這樣)而是多了一個選擇,Webform在短期之內不會消亡,儘管存在許多缺點,

8ASP.NET MVC入門精通——View(檢視)

View檢視職責是向用戶提供介面。負責根據提供的模型資料,生成準備提供給使用者的格式介面。 支援多種檢視引擎(Razor和ASPX檢視引擎是官方預設給出的,其實還支援其它N種檢視引擎,甚至你自己都可以寫一套檢視引擎) View和Action之間資料傳遞(前後臺數據傳遞)   弱型別 View

5ASP.NET MVC入門精通——NHibernate程式碼對映

使用的是xml進行orm對映,那麼這一篇就來講下程式碼對映。 新建一個抽象的資料化持久基類AbstractNHibernateDao.cs /// <summary> /// 資料持久化基本 /// </summary> ///

12ASP.NET MVC入門精通——HtmlHelper

HtmlHelper:是為了方便View的開發而產生 HtmlHelper的演變 普通首頁超級連結為:<a href="/home/index">首頁</a> 當路由改變時候則可能需要修改為:<a href="/home/index1">首頁</a&

9ASP.NET MVC入門精通——Controller(控制器)

Controller主要負責響應使用者的輸入。主要關注的是應用程式流,輸入資料的處理,以及對相關檢視(View)輸出資料的提供。 繼承自:System.Web.Mvc.Controller 一個Controller可以包含多個Action. 每一個Action都是一個方法, 返回一個Act

22ASP.NET MVC入門精通——搭建專案框架

前面的章節,說了ASP.NET MVC專案中常用的一些技術和知識點,更多的是理論上面的東西,接下來,我將通過一個簡單的OA專案來應用我們之前涉及到的一些技術,為了兼顧初學者,所以我儘量把操作步驟說得足夠詳細。(本來想用VS2015來演示MVC5開發的,無奈家裡的筆記本是11年2月份的老爺機了,一直未曾捨得

7ASP.NET MVC入門精通——第一個ASP.NET MVC程式

開發流程 新建Controller 建立Action 根據Action建立View 在Action獲取資料並生產ActionResult傳遞給View。 View是顯示資料的模板 Url請求→Controller.Action處理→View響應 url請求→Controller.Ac

11ASP.NET MVC入門精通——AspnetMVC分頁

說起分頁,這基本上是我們Web開發中遇見得最多的場景,沒有之一,可即便如此,要做出比較優雅的分頁還是需要技巧的。這裡我先說一種ASP.NET MVC中很常見的一種分頁的實現方式,很low,但是很多公司的專案就是這麼用的,我現在公司的專案就是也是,有時候面對公司專案屎一樣的使用者體驗和雜亂的程式碼,真是恨不

13ASP.NET MVC入門精通——MVC請求管道

ASP.NET MVC的請求管道和ASP.NET請求管道基本上一模一樣,如果你對ASP.NET請求管道十分熟悉的話,你只要關注一下不同點。看懂下面兩張圖,你就基本上明瞭了,這兩張圖是從鄒華棟部落格上面取的。(說明:我不是給傳智帶鹽的,這圖確實畫得通俗易懂)不明白的地方,用reflector工具檢視MVC的

25ASP.NET MVC入門精通——Spring.net-業務層倉儲

上一節,我們已經把專案框架的雛形搭建好了,那麼現在我來開始業務實現,在業務實現的過程當中,不斷的來完善我們現有的框架。 1、假設我們來做一個使用者登入的業務 那麼我們可以現在IDAL專案中定義的的介面IOu_UserInfoDAL,注意是部分類partial,為了方便管理,把這些擴充套件的部分介面都統

20ASP.NET MVC入門精通——WebAPI

微軟有了Webservice和WCF,為什麼還要有WebAPI? 用過WCF的人應該都清楚,面對那一大堆複雜的配置檔案,有時候一出問題,真的會叫人抓狂。而且供不同的客戶端呼叫不是很方便。不得不承認WCF的功能確實非常強大,可是有時候我們通常不需要那麼複雜的功能,只需要簡單的僅通過使用Http或Https

17ASP.NET MVC入門精通——Spring.net入門

Spring.NET環境準備 下載後解壓   Spring.NET-1.3.2.7z:這個裡面有我們需要用到的所有東西。 Spring.NET-1.3.2.exe:安裝檔案 Spring.NET-1.3.2-API.chm:幫助文件 NHibernate 3.2 的下載地址:   

26ASP.NET MVC入門精通——後臺管理區域及分離Js壓縮cssjquery擴充套件

有好一段時間沒更新博文了,最近在忙兩件事:1、看書,學習中...2、為公司年會節目做準備,由於許久沒有練習雙截棍了,難免生疏,所以現在臨時抱佛腳。深圳最近的天氣反常,許多人感冒了,我也成為其中之一,大家注意身體... 這一篇,我來簡單的講一下接下來專案中會用到的一些雜七雜八的技術。 區域及分離

21ASP.NET MVC入門精通——ASP.NET MVC4優化

刪除無用的檢視引擎 預設情況下,ASP.NET MVCE同時支援WebForm和Razor引擎,而我們通常在同一個專案中只用到了一種檢視引擎,如Razor,那麼,我們就可以移除掉沒有使用的檢視引擎,提高View檢視的檢索效率。在沒有刪除WebForm引擎之前,檢索控制器中不存在的檢視時,我們可以從下圖看

23ASP.NET MVC入門精通——業務層和資料層父類及介面-T4模板

在上一篇中,我們已經把專案的基本框架搭起來了,這一篇我們就來實現業務層和資料層的父介面及父類。 1、我們先來定義一個業務層父介面IBaseBLL.cs using System; using System.Collections.Generic; using System.Linq; u

1ASP.NET MVC入門精通——新語法

在學習ASP.NET MVC之前,有必要先了解一下C#3.0所帶來的新的語法特性,這一點尤為重要,因為在MVC專案中我們利用C#3.0的新特性將會大大的提高我們的開發效率,同時,在MVC專案中你將到處可以看到C#3.0新特性的身影。其本質都是“語法糖”,由編譯器在編譯時轉成原始語法。 目錄 自動屬

10ASP.NET MVC入門精通——Model(模型)和驗證

模型就是處理業務,想要儲存、建立、更新、刪除的物件。 註解(通過特性實現) DisplayName Required StringLength(20,MinimumLength=2) DataType(System.ComponentModel.DataAnnotations.Dat