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=" 7 Data Source=localhost; 8 User Id=sa; 9 Password=11111111; 10 Initial Catalog=DatabaseFirst; 11 Integrated Security=False; 12 MultipleActiveResultSets=True;"; 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=" 7 Data Source=localhost; 8 User Id=sa; 9 Password=11111111; 10 Initial Catalog=ModelFirst; 11 Integrated Security=False; 12 MultipleActiveResultSets=True;"; 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和多數據庫的支持。
出處: http://yilin.cnblogs.com 本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在頁面明顯位置給出原文連接,不然保留追究法律責任的權利。