EF3:Entity Framework三種開發模式實現數據訪問

原文連接:http://www.cnblogs.com/yilin/archive/2013/02/22/apollo_blog_ef_chapter2.html?utm_source=tuicool&utm_medium=referralhtml

前言

Entity Framework支持Database First、Model First和Code Only三種開發模式,各模式的開發流程截然不同,開發體驗徹底不同。三種開發模式各有優缺點,對於程序員沒有哪一種模式最好,只有哪一種模式更適合。接下來我將分別使用這三種開發模式實現同一數據庫模型的數據持久化功能。但願經過實踐能幫助你找到更適合你的開發模式程序員

Database First

Database First開發模式指以數據庫設計爲基礎,並根據數據庫自動生成實體數據模型,從而驅動整個開發流程。該模式的好處在於使用簡單,容易入手。sql

爲了下降學習難度,本文的數據庫模型設計得儘可能簡單,以下圖所示:數據庫

 

1數據庫模型圖編程

對應的DDL語句以下:數據庫設計

複製代碼
 1 --建立表
 2 CREATE TABLE [User](
 3     [ID] [uniqueidentifier] NOT NULL,
 4     [Name] [nvarchar](40) NOT NULL,
 5 PRIMARY KEY CLUSTERED([ID] ASC) ON [PRIMARY])
 6 GO
 7 
 8 CREATE TABLE [Role](
 9     [ID] [uniqueidentifier] NOT NULL,
10     [Name] [nvarchar](40) NOT NULL,
11 PRIMARY KEY CLUSTERED([ID] ASC) ON [PRIMARY])
12 GO
13 
14 CREATE TABLE [UserRole](
15     [UserID] [uniqueidentifier] NOT NULL,
16     [RoleID] [uniqueidentifier] NOT NULL,
17 PRIMARY KEY CLUSTERED([UserID] ASC, [RoleID] ASC) ON [PRIMARY])
18 GO
19 
20 --建立外鍵
21 ALTER TABLE [UserRole] WITH CHECK ADD CONSTRAINT [FK_UserRole_User] FOREIGN KEY([UserID])
22 REFERENCES [User] ([ID])
23 ON DELETE CASCADE
24 GO
25 
26 ALTER TABLE [UserRole] WITH CHECK ADD CONSTRAINT [FK_UserRole_Role] FOREIGN KEY([RoleID])
27 REFERENCES [Role] ([ID])
28 ON DELETE CASCADE
29 GO
複製代碼

建立名爲「DatabaseFirst」的數據庫,並執行以上的DDL語句,就能夠創建本示例所需的數據庫對象了。編輯器

在Visual Studio解決方案的DatabaseFirst項目中,添加一個名爲DatabaseFirst.edmx的ADO.NET實體數據模型,以下圖所示:ide

 

2添加ADO.NET實體數據模型工具

點擊「添加」按鈕後,進入建立實體數據模型嚮導的選擇模型內容界面,以下圖所示:post

 

3選擇從數據庫生成模型

選擇「從數據庫生成」圖標,並點擊「下一步」按鈕,進入選擇數據鏈接界面,以下圖所示:

 

4設置數據鏈接

指定你的本地數據鏈接,選擇「是,在鏈接字符串中包括敏感數據」選項,併爲實體鏈接設置名稱爲「DatabaseFirst」,點擊「下一步」按鈕,進入選擇數據庫對象界面,以下圖所示:

 

5選擇數據庫對象

可供選擇的數據庫對象包括表、視圖和存儲過程。按上圖所示設置後,點擊「完成」按鈕,Visual Studio將自動完成從Database到實體數據模型的生成工做。以下圖所示:

 

6由數據庫生成的實體對象模型

至於生成內容的細節,在此就不做說明了,後續會用一整篇文章來深刻剖析實體數據模型的方方面面。

至此,實體數據模型的創建算是完成了。在測試項目的應用程序配置文件中加入數據庫鏈接配置,以下所示:

複製代碼
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3   <connectionStrings>
 4     <add name="DatabaseFirst" providerName="System.Data.EntityClient"
 5          connectionString="provider=System.Data.SqlClient;
 6                            provider connection string=&quot;
 7                            Data Source=localhost;
 8                            User Id=sa;
 9                            Password=11111111;
10                            Initial Catalog=DatabaseFirst;
11                            Integrated Security=False;
12                            MultipleActiveResultSets=True;&quot;;
13                            metadata=res://*/DatabaseFirst.csdl|
14                                      res://*/DatabaseFirst.ssdl|
15                                      res://*/DatabaseFirst.msl"/>
16   </connectionStrings>
17 </configuration>
複製代碼

使用該實體數據模型的測試代碼以下:

複製代碼
 1 using Apollo.Blog.EF.Chapter2.DatabaseFirst;
 2 …
 3 
 4 using (var db = new DatabaseFirst.DatabaseFirst())
 5 {
 6     var role = new Role();
 7     role.ID = Guid.NewGuid();
 8     role.Name = "Administrator";
 9     db.Roles.AddObject(role);
10 
11     var user = new User();
12     user.ID = Guid.NewGuid();
13     user.Name = "Apollo";
14     user.Roles.Add(role);
15     db.Users.AddObject(user);
16 
17     db.SaveChanges();
18 }
複製代碼

 

Model First

Model First開發模式是指從創建實體數據模型入手,並依據模型生成數據庫,從而驅動整個開發流程。該模式也就是業界流行的面向領域的編程模式,它的優勢在於,程序員能夠用與設計建模相同的思惟來進行代碼編寫,更符合面向對象的思想。Model First與Database First是互逆的,但最終都是輸出數據庫和實體數據模型。

在Visual Studio解決方案的ModelFirst項目中,添加一個名爲ModelFirst.edmx的ADO.NET實體數據模型,以下圖所示:

 

7添加ADO.NET實體數據模型

點擊「添加」按鈕後,進入建立實體數據模型嚮導的選擇模型內容界面,以下圖所示:

 

8選擇空模型進行建模

選擇「空模型」,點擊「完成」按鈕,,Visual Studio將新建一個空的實體數據模型。以下圖所示:

 

9生成的空模型

工具箱中提供了建模須要的實體、關聯和繼承元素。經過使用這些元素,創建以下的實體數據模型:

 

10手動建模

用XML(文本)編輯器的方式打開ModelFirst.edmx文件,能夠看到SSDL和MSL部分的映射代碼是空的,而只產生了CSDL部分的代碼;與此同時,查看ModelFirst.Designer.cs文件,發現實體類和上下文環境類已經建立了。咱們只需將SSDL和MSL部分的代碼產生就大功告成了。

首先,先使用SQL Server Management Studio工具建立一個名爲ModelFirst的空數據庫,以下圖所示:

 

11建立數據庫

。而後,在Visual Studio中雙擊ModelFirst.edmx,回到模型關係圖視圖,在視圖的空白處點擊鼠標右鍵,打開右鍵菜單,以下圖所示:

 

12根據模型生成數據庫

選擇「根據模型生成數據庫」菜單項,將進入「生成數據庫」嚮導,以下圖所示:

 

13設置數據庫鏈接

選擇ModelFirst數據鏈接(若是是第一次使用鈣鏈接,請使用 「新建鏈接」按鈕新建一個指向ModelFirst數據庫的鏈接),並按上圖所示設置後,點擊「下一步」按鈕,進入「摘要和設置」界面,以下圖所示:

 

14自動生成的DDL內容

此時,Visual Studio已經自動生成了DDL語句,點擊「完成」按鈕,將ModelFirst.edmx.sql文件加入項目中。此時,再用XML(文本)編輯器的方式打開ModelFirst.edmx文件,能夠看到SSDL和MSL部分的映射代碼也已經生成了。對比ModelFirst和DatabaseFirst生成的.edmx文件和.Designer.cs後臺文件,會發現二者內容實際上是同樣的。

數據庫對象的生成有兩種方式,一種是在SQL Server Management Studio中執行ModelFirst.edmx.sql;另外一種是使用生成的上下文環境類建立:

1 using (var db = new ModelFirst.ModelFirstContainer())
2 {
3     if (!db.DatabaseExists())
4         db.CreateDatabase();
5 }

至此,實體數據模型的創建算是完成了。在測試項目的應用程序配置文件中加入數據庫鏈接配置,以下所示:

複製代碼
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3   <connectionStrings>
 4     <add name="ModelFirstContainer" providerName="System.Data.EntityClient"
 5          connectionString="provider=System.Data.SqlClient;
 6                            provider connection string=&quot;
 7                            Data Source=localhost;
 8                            User Id=sa;
 9                            Password=11111111;
10                            Initial Catalog=ModelFirst;
11                            Integrated Security=False;
12                            MultipleActiveResultSets=True;&quot;;
13                            metadata=res://*/ModelFirst.csdl|
14                                      res://*/ModelFirst.ssdl|
15                                      res://*/ModelFirst.msl"/>
16   </connectionStrings>
17 </configuration>
複製代碼

使用該實體數據模型的測試代碼以下:

複製代碼
 1 using Apollo.Blog.EF.Chapter2.ModelFirst;
 2 …
 3 
 4 using (var db = new ModelFirst.ModelFirstContainer())
 5 {
 6     var role = new Role();
 7     role.ID = Guid.NewGuid();
 8     role.Name = "Administrator";
 9     db.Roles.AddObject(role);
10 
11     var user = new User();
12     user.ID = Guid.NewGuid();
13     user.Name = "Apollo";
14     user.Roles.Add(role);
15     db.Users.AddObject(user);
16 
17     db.SaveChanges();
18 }
複製代碼

 

Code Only

Code Only開發模式也叫Code First開發模式,指的是程序員徹底經過手動編碼,就可使用Entity Framewokr技術來實現數據訪問。該模式的優勢在於,支持POCO(Plain Old CLR Objects,簡單傳統CLR對象),代碼整潔,程序員對代碼的控制也更靈活自如。Code Only模式的代碼結構以下圖所示:

 

15 Code Only開發模式的代碼結構

Code Only開發模式須要Entity Framework Feature CTP支持,建議下載並安裝最新的Entity Framework Feature CTP 5。安裝後,Visual Studio解決方案的爲CodeOnly項目添加該組件安裝目錄下的EntityFramework.dll庫引用。

接下來在該項目中添加Role和User兩個POCO類。其中,Role.cs主要代碼以下:

複製代碼
1 public class Role
2 {
3     public Guid ID { get; set; }
4 
5     public string Name { get; set; }
6 
7     public IList<User> Users { get; set; }
8 }
複製代碼

User.cs主要代碼以下:

複製代碼
1 public class User
2 {
3     public Guid ID { get; set; }
4 
5     public string Name { get; set; }
6 
7     public IList<Role> Roles { get; set; }
8 }
複製代碼

 而後,建立一個對象上下文環境EntityContext.cs,主要代碼以下:

複製代碼
 1 using System.Data.Entity;
 2 …
 3 public class EntityContext : DbContext
 4 {
 5     public EntityContext() : base("CodeOnly") { }
 6 
 7     public DbSet<Role> Roles { get; set; }
 8 
 9     public DbSet<User> Users { get; set; }
10 }
複製代碼

OK,實體數據模型建成了。在測試項目的應用程序配置文件中加入數據庫鏈接配置,以下所示:

複製代碼
1 <?xml version="1.0" encoding="utf-8"?>
2 <configuration>
3   <connectionStrings>
4     <add name="CodeOnly" connectionString="data source=YILIN;initial catalog=CodeOnly;persist security info=True;user id=sa;password=11111111" providerName="System.Data.SqlClient"/>
5   </connectionStrings>
6 </configuration>
複製代碼

使用該實體數據模型的測試代碼以下:

複製代碼
 1 using (var db = new EntityContext())
 2 {
 3     db.Database.CreateIfNotExists();
 4 
 5     var role = new Role();
 6     role.ID = Guid.NewGuid();
 7     role.Name = "Administrator";
 8     db.Roles.Add(role);
 9 
10     var user = new User();
11     user.ID = Guid.NewGuid();
12     user.Name = "Apollo";
13     user.Roles = new List<Role>() { role };
14     db.Users.Add(user);
15 
16     Assert.IsTrue(db.SaveChanges() > 0);
17 }
複製代碼

能夠看到,得益於Entity Framework Feature CTP 5對Entity Framework的擴展,使得咱們以Code Only模式編程時,幾乎感受不到Entity Framework的存在,也就是幾乎不用作另外的事情去適應它,這是一件很美好的事情。而且,微軟官方承諾了將把Entity Framework Feature CTP 5的內容歸入到.NET Framework的後續版本中,屆時將再也不須要另外下載並安裝Entity Framework Feature CTP 5,Entity Framework自己就支持這些特性了。

 

總結

本文依次使用Entity Framework支持的Database First、Model First和Code Only三種開發模式實現數據的快速訪問。Database First是Entity Framework最先支持,也是最容易上手的一種開發模式,建議初學者選擇該模式入手;Model First模式也即面向領域的編程模式,該模式更能體現面向對象的思想;Code Only模式適合對Entity Framework技術較熟悉的程序員,它能讓你的代碼更整潔、更易維護。

接下來,我將對實體數據模型進行剖析,詳細講解Entity Framework如何實現對象-關係映射這一ORM的核心功能;在此基礎上,給出一種DIY實體數據模型,實現對POCO和多數據庫的支持。

 

附件下載:示例源碼+本文PDF版本

做者: 張博
出處: http://yilin.cnblogs.com  本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在頁面明顯位置給出原文連接,不然保留追究法律責任的權利。
相關文章
相關標籤/搜索