.Net開發人員可以擁抱Entity Framework 了(EF4.3 Release!!!)


    EF4.3於2月9號正式發布了,微軟的EF小組最近一年開始發力,在4.3版本中新加了重要的特性:“數據庫遷徙”。對於ORM框架來說,沒有Code First功能,幾乎沒有吸引力,因為很少開發人員會去用那些自動生成的、難以駕馭的實體類,不夠優雅。在Python等語言中的ORM框架,早就有了Code First的功能,而對於EF之前都是Databas First或者Model First,Code First在EF4中才出來,而且很不完善,其中最大的不足就是數據庫模型的維護比較麻煩,無法實現添加或者刪除實體的某些字段后,方便的更新數據庫中的表結構,需要開發人員花大量精力去維護數據庫結構的升級以及保留歷史數據,在開發過程中很不方便。 在這次的4.3版本中,數據庫遷徙功能終於是千呼萬喚始出來。微軟的產品有個特點,早期很難用,但是越到后面越好用,慢慢的超過同類產品,所以對於.NET開發人員,我個人覺得是時候下功夫去深入學習並在實際項目中應用EF了,我和我的團隊已經開始了。

 

閱讀目錄

  1. EF4.3中的新特性

  2. 輕而易舉維護數據庫

    2.1 環境配置

    2.2 開始最簡單的應用

    2.3 自定義數據庫變更規則

    2.4 版本回溯和Sql腳本生成

     3. 展望EF5

  4. 總結

 

1. EF4.3中的新特性

1. 數據庫遷徙: 這是EF4.3中最重要的新特性,這樣我們就能將精力集中在程序員喜歡做的事情上:寫簡單傳統的CLR實體(Plain Old CLR Object),而不是寫SQL語句去維護數據庫,想添加一個字段就添加,想刪除就刪除,想修改名字就修改,是不是很爽?

2. 刪除了EdmMetadata表:這個表就是一個半成品,用CodeFirst根本不會用這個表去維護數據庫,因為有了數據庫遷徙功能,數據庫的結構信息能夠自動生成,因此這個表就是多余的了。

3. 非Public字段上也可以添加數據描述屬性了:以前默認情況下,Code First 會忽略private、protected和internal字段上的屬性信息,即使你寫代碼將這些字段包含到你的模型里面(通過Fluent API),這些字段上的屬性信息也會被忽略。在這個版本中,如果你通過Fluent API將這些非Public字段加入你的模型,所有屬性信息都能起作用了。

4. 能夠在配置文件中進行更多的設置: 在App/Web.config 文件中能針對Code First方式進行更多的配置,比如設置默認的數據庫的Connection Factory和數據庫初始化器,甚至可以在配置文件中設置實體對象的構造函數參數。更多的配置信息可以在官方博客中找到。

5. 修改了一系列的Bug,包括Unicode的DbSet名稱等等。

 

2. 輕而易舉維護數據庫

下載下面示例代碼

 2.1 環境配置

  

名稱 說明
VS2010 因為要用NuGet
NuGet 數據庫遷徙用到了NuGet的命令行工具,NuGet是非常有用的工具,如果還沒有用過這個工具,可以百度一下,也可以去開源社區了解和學習,最好升級到最新版本(我是1.6)。
EF4.3 這個可以直接用NuGet,安裝並引用到你的項目中。如果你安裝過beta版本,相信你也會用NuGet的命令工具升級: Update-Package EntityFramework

 2.2 最簡單的應用嘗試

 軟件開發是一個迭代增量的過程,沒有人能夠一開始就完全設計好數據模型,因此對於Code First來說,最常見的開發場景是隨着功能需求不斷完善我們的數據模型。下面開始一步一步嘗試數據庫遷徙功能。在示例中我用Asp.net MVC3項目,首先新建一個項目,選擇空模板,默認情況會引用一個EntityFramework,但很可能是4.1版本,刪除這個引用,我們用NuGet將4.3版本的EF引入MVC3中:

 

當然你也可以通過命令行的方式(打開NuGet的Package Management Console,PMC):PM> Install-package EntityFramework

假設我們要建立的是一個網上書店,首先我們通過Code First建立我們的模型:

    public class BookContext : DbContext
{
public DbSet<Book> Books { get; set; }
}

public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
public double Price { get; set; }
}

非常簡單的模型,下一步是在我們網站上使用這個模型,將書以列表的方式顯示出來,第一步添加HomeController:

 public class HomeController : Controller
{
public ActionResult Index()
{
BookContext db = new BookContext();
db.Books.Add(new Book { Title = "Think in C++", Price = 59 });
db.SaveChanges();
return View(db.Books.ToList());
}
}

第二步添加對應的View:

@model List<MigarationDemo.Models.Book>
@{
ViewBag.Title = "網上書店";
}

<h2>書店里面有以下書籍</h2>

<ul>
@{
foreach (var item in Model) {
<li>書名: @item.Title</li>
}
}
</ul>

然后F5,你就應該在瀏覽器里面看到下面的結果:



我們什么也沒干,一個簡單的網站就完成了,是不是很神奇?我們甚至沒有配置數據庫連接字符串。這都是因為EF設計的原則是“約定好於配置” (Convention Over Configuration),默認情況下,EF找你本機上的SqlExpress數據庫,因為我機器上有這個數據庫,所以EF就能自動連接數據庫,然后根據上面的數據模型生成對應的數據庫:

 
 如果到這里,一切都正常,讓我們進入正題,使用EF4.3中的Migaration功能:

第一步:修改我們的模型,由於新的需求,每本書還應該有一個ISBN編號:

   public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
public double Price { get; set; }
public string ISBN { get; set; }
}

如果這時候,你按F5,運行系統,會出現非法操作異常:“The model backing the 'BookContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).” 提示我們,應該進行數據庫遷移。

很簡單,只需要在PMC中執行下面3個命令:

1. Enable-Migrations

2. Add-Migration Book-ISBN   (Book-ISBN是任意一個名稱標記,用來標記一個遷移點)

3. Update-Database

如果執行完上面三個命令,並且一切順利,恭喜你,數據庫升級完成,你應該在項目里面看到:

並且數據庫已經變成:

這時候F5,運行系統,應該一切正常了,你可以嘗試在Controller中加入另外一條記錄,我加入了:

db.Books.Add(new Book {
Title = "Think in C++ Volumne Two: Practical Programming",
Price = 59,
ISBN = "978-7-111-17115-7"
});

因此看到的是:

到此為止,我們已經一步一步完成了最簡單的數據庫遷徙/升級, 在上面生成的Migarations文件夾中主要一個配置文件和一個數據庫遷移文件,數據庫遷移文件有兩個函數,一個是Up,即升級數據庫,一個事Down,即回溯數據庫,去看看生成的代碼很容易理解它干了什么。
 

2.3 自定義數據庫變更規則

雖然EF能夠自動根據數據模型生成對應的數據庫結構,但是通常自動生成的數據庫只是最基本的,通常我們需要設置更多的屬性。比如上面的Book數據模型,默認的數據庫是以BookId這個主鍵建立索引,可是我們還希望以Title建立索引,這樣我們能夠快速的根據書名查找。另外,上面示例中,添加ISBN字段后,已經有了的數據默認是Null,這會在程序中引起不必要的麻煩,我們假設希望已有的記錄的ISBN是000-0-000-00000-0。

面對上面這些需求,我們首先通過下面命令新建一個遷徙:

Add-Migration IndexTitleAndDefault

在項目樹的Migrations文件夾下面會生成一個新的cs文件,我的是201202191349250_IndexTitleAndDefault.cs,注意前面時間戳會不一樣。

然后修改生成的遷移文件:

 public partial class IndexTitleAndDefault : DbMigration
{
public override void Up()
{
AlterColumn("Books", "Title", c => c.String(nullable: false,maxLength:100));
CreateIndex("Books", "Title", true,"Index_Title");
AlterColumn("Books", "ISBN", c => c.String(nullable: false, defaultValue: "000-0-000-00000-0"));

}

public override void Down()
{
DropIndex("Books", "Index_Title");
}
}

最后執行命令:Update-Database,數據庫應該建立了Title的索引,並且ISBN的默認值是000-0-000-00000-0。

 2.5 版本回溯和Sql腳本生成

 上面所有操作都是更新到最新的版本,但有時候我們希望數據庫能回溯到以前的版本,這在以前手動維護數據庫時候是比較困難的,而EF4.3提供的數據庫變遷特性能很方便的進行回溯:

只需要執行Updat-Database命令的時候,加入–TargetMigration:"XXX" 參數即可,比如我們想回到第二步的版本,我們只需要執行:

PM> Update-Database  –TargetMigration:"201202190625099_Book-ISBN"

但是為了實現版本回溯,我們就得特別注意實現Down函數,相當於Down函數式Up函數的反函數。

 另外執行Update-Database命令的時候加入-Script參數,這樣就不是直接修改數據庫結構,而是生成相應的Sql腳本:

Update-Database -Script -SourceMigration:"aaa" -TargetMigration:"bbb" 

如果不指定TargetMigration,就默認是遷徙到最新的版本。

3. 展望EF5

 據微軟的開發團隊透露,EF的下一個版本是EF5,微軟的版本號非常混亂,最開始EF是1.0,后來說要和.Net Framwork的版本號統一,所以直接就上到了EF4,現在.Net Framework的下一個版本是4.5,可是EF又要變成5了,他們在搞什么? 不管怎么樣,看這個勢頭,EF5還是很值得期待的,有可能有以下改進:

1. 支持枚舉類型

2. 性能將有很大提升

3. 改進SQL語句的生成,目前EF生成的Sql語句會比較復雜,在下一版本中將可能改善。 

如果你希望EF有什么功能,可以去他們的網站投票,雖然最后決定權在微軟Guy,但是你的一票可能會影響他們選擇先開發什么功能。

4. 總結 

 現在看來,EF正在成為一個優秀的ORM框架,將能極大的提高程序員的開發效率,能夠將程序員從數據訪問層解脫出來,專注於業務邏輯層。當然,要掌握好EF,需要更加深入的學習,比如應該了解它都有哪些約定,應該了解一下它為我們生成的Sql語句,這樣有助於我們寫出高效的代碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM