EntityFramework學習心得


EntityFramework是什麼

ADO.NET Entity Framework 是微軟以 ADO.NET 爲基礎所發展出來的對象關係對應 (O/R Mapping) 解決方案,早期被稱爲 ObjectSpace,現已經包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中發表。

ADO.NET Entity Framework  Entity Data Model (EDM) 爲主,將數據邏輯層切分爲三塊,分別爲 Conceptual Schema, Mapping Schema  Storage Schema 三層,其上還有 Entity ClientObject Context 以及 LINQ 可以使用。

關於EntityFramework的更多可以參考,這裏就不在詳細羅列了

Msdn上的EntityFramework     http://msdn.microsoft.com/en-us/library/bb399572.aspx

維基百科上的EntityFramework  http://zh.wikipedia.org/wiki/ADO.NET_Entity_Framework

如何使用EntityFramework

自己按照MVC3.0Demo音樂商店(MusicStore)的演示從頭到尾做了一遍(解決方案取名MvcApplication1),下面我們來看看在MVC中如何使用EntityFramework。在這個案例中有如下幾個地方涉及到跟EntityFramework有關的地方:

Ø         Global.asax.cs

Ø         MvcApplication1.Models.SampleData.cs

Ø         MvcApplication1.Models.MusicStoreEntities.cs

Ø         Web.Config

我們一個文件一個文件的先看一遍。

Global.asax.cs

Global.asax.cs類中的Application_Start方法添加了一行代碼

      

 Application_Start()方法見MSDN:

The Application_Start and Application_End methods are special methods that do not represent HttpApplication events. ASP.NET calls them once for the lifetime of the application domain, not for each HttpApplication instance.

即在Asp.net應用程序第一次啓動時會啓動該事件。

我們將鼠標放在SetInitializer方法上面會出現

Gets or sets the database initialization strategy. The database initialization strategy is called when DbContext instance is initialized from a DbCompiledModel. The initialization strategy can optionally check for database existence, create a new database, and seed the database with data. The default strategy is an instance of DropCreateDatabaseIfModelChanges(Of TContext) created with useSeedData set to true.

什麼意思,簡單翻譯就是:設置或獲取數據庫初始化策略。當DbContext被實例化時這個數據庫初始化策略將被調用。初始化策略可以選擇檢查數據庫是否存在,創建一個新的數據庫,用數據填充數據庫。默認的策略是DropCreateDatabaseIfModelChanges類的一個實例,這個實例包含用戶填充數據集合。


SetInitializer語法

注意:參數類型是TContext類型的。

 

MvcApplication1.Models.SampleData.cs

打開Model.SampleData類,看到最前面的幾句代碼


很簡單,我們可以看出:

²      SampleData類繼承自DropCreateDatabaseIfModelChanges類(就是SetInitializerstrategy參數的默認實例類型)

²        有一個重寫的方法Seed

我們將鼠標放在DropCreateDatabaseIfModelChanges方法上面會出現

An implementation of IDatabaseInitializer(Of TContext)that will delete, recreate, and optionally re-seed the database with data only if the model has changed since the database was created. This is achieved by writing a hash of the store model to the database when it is created and then comparing that hash with one generated from the current model. To seed the database, create a derived class and override the Seed method.

簡單翻譯一下就是:它是IDatabaseInitializer類的一種實現,僅當數據庫已經存在且模型發生改變時會刪除原有的數據庫,重新建立數據庫並填充數據庫。當數據庫創建後通過將一系列的存儲模型寫到數據庫中來實現填充數據的。這需要創建一個子類並重寫Seed方法。

因此SampleData類繼承自DropCreateDatabaseIfModelChanges類並重寫Seed方法。


DropCreateDatabaseIfModelChanges語法

注意:類型是TContext類型,而Tcontext是繼承自DbContext類。


注意:有一個Seed方法,必須重寫。


Seed方法語法

       Sees參數類型爲Tcontext類型的,在方法內用數據來填充參數context,在本例中即向MusicStoreEntities對象context內填充數據。

MvcApplication1.Models.MusicStoreEntities.cs

打開MvcApplication1.Models.MusicStoreEntities文件,


可以看到MusicStoreEntities類是繼承自DbContext類的,且包含了DbSet類型的數據。

我們將鼠標放在DbSet上,可以看到

Represents an entity set that is used to perform create, read, update, and delete operations. A non-generic version of DbSet(Of TEntity) which can be used when the type of entity is not known at build time.

也就是代表實體集,用於執行創建,讀取,更新和刪除操作數據。非泛型版本的DbSet實體類型在編譯時類型沒有確定但也可以使用。

       打開數據庫,我們可以看到數據庫表和該類成員基本上一一對應,類實現數據庫的增刪改查操作。

Web.Config

打開Web.Config文件,看到數據庫連接字符串:


NameMusicStoreEntities對應着MvcApplication1.Models.MusicStoreEntities類,connectionString對應着數據庫連接串,在這裏表示App_Data文件夾中的MvcMusicStore.sdf數據庫文件。

 

總結

這四個文件看完了,它們的邏輯關係也就一目瞭然了。

System.Data.Entity.Database.SetInitializer( A);默認參數是DropCreateDatabaseIfModelChanges類型的

 

A是繼承自DropCreateDatabaseIfModelChanges(B)的,且重寫了Seed方法

 

B又是繼承自DbContext的,包含了數據庫的數據模型,實現數據庫基本操作

 

同時B又是Web.Config文件中連接字符串的名

 

       當我們的數據庫已經建立好了,並且存儲有數據或不需要初始化應用程序時填充數據,這時我們在程序中只需要配置好web.Config文件的數據庫連接字符串,同時建立對應的數據庫操作類(繼承自DbContext)即可。

發佈了56 篇原創文章 · 獲贊 9 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章