基架和實體框架 EF(Entity Framework)是一個對象關係映射框架,可以在關係型數據庫中保存對象,也可以利用LINQ
查詢語句檢索那些保存關係型數據庫中的.NET對象
我們之前所建的模型類中所有的屬性都是虛屬性,意思就是該屬性不是必須的,但是它們給EF提供一個指向純C#類集的鉤
子,併爲EF啓用了一些特性,EF需要知道模型屬性值的修改時刻,在這一刻生成UPDate語句,使這些改變和數據庫保持一致.
代碼優先約定
EF對於外鍵關係、數據庫名稱等有約定,這些約定取代了以前需要提供給一個關係對象映射框架的所有映射和配置
DbContext
在使用代碼優先約定時,需要使用從EF的DbContext類派生出一個類來訪問數據庫.該類可以有一個以上的的DbSet<T>類
型的字段,類型DbSet<T>的每一個T代表一個想要持久保存的對象
執行基架模板
1、數據上下文
上文提到的從DbContext類繼承而來的類,如下:
public class MusicStoreDB : DbContext
{
/// <summary>
/// 用來存儲Album類型的對象,相當於數據庫中的Album表
/// </summary>
public DbSet<Album> Albums
{
get;
set;
}
/// <summary>
/// 用來存儲Artist類型的對象,相當於數據庫中的Artist
/// </summary>
public DbSet<Artist> Artists
{
get;
set;
}
/// <summary>
/// 用來存儲Genre類型的對象,相當於數據庫中的Genre表
/// </summary>
public DbSet<Genre> Genres
{
get;
set;
}
}
如果需要訪問數據庫,只需要實例化這個數據上下文類即可.
2、加載相關對象
① 預加載:盡其所能的使用查詢語句加載所有數據
② 延遲加載:根據需求來 加載相關數據
執行基架代碼
1、用實體框架創建數據庫
EF的代碼優先儘可能的使用約定而非配置,如果不配置從模型到數據庫表的映射,EF將用約定創建一個數據庫模式,如果
不配置具體數據庫連接,則EF按約定自己創建一個連接
EF連接到服務器,如果找不到數據庫則會創建一個數據庫,該數據庫中EdmMetadata表是EF用來確保模型類和數據庫模式
同步的.如果修改模型類如添加或刪除模型類的一個屬性,那麼EF要不根據模型類重新創建數據庫,要不報出就拋出異常.
2、使用數據庫初始化器
保持數據庫和模型變化同步的一個簡單方法是允許實體框架重新創建一個現有的數據庫可以告知EF在應用程序每次重啓
或者檢測到模型變化時重建數據庫.
調用EF的Database類靜態的SetInitializer方法時,需要爲其傳遞一個IDataBaseInitializer對象,而框架中帶有 兩個
DatabaseInitializer對象:DropCreateDatabaseAlways和 DropCreateDatabaseIfModelChanges,兩個初始化器都需要一個
泛型類的參數,並且這個參數必須是DbContext的派生 類:
示例:在每次啓動程序時設置一個初始化器
在global.asax.cs內部Application_Star()方法中添加一句代碼
Database.SetInitializer(new DropCreateDatabaseAlways<MusicStoreDB>)());
3、播種數據庫
如果需要在程序運行時有一些初始數據,可以創建DropCreateDatabaseAlways類並重寫Seed方法
如下:
public class MusicStoreDbInitializer : DropCreateDatabaseAlways<MusicStoreDB>
{
/// <summary>
/// 重寫Seed方法爲程序提供原始數據
/// </summary>
/// <param name=“context”></param>
protected override void Seed(MusicStoreDB context)
{
context.Artists.Add(new Artist
{
Name = "Olive"
});
context.Genres.Add(new Genre
{
Name = "Classic"
});
context.Albums.Add(new Album
{
Artist = new Artist
{
Name = “Only”
},
Genre = new Genre
{
Name = "Pop"
},
Price = 9.99m,
Title = "Only for you"
});
base.Seed(context);
}
這個時候我們還需要在Application_Start事件中添加如下代碼:
Database.SetInitializer(new MusicStoreDbInitializer());
總的來說我們只需要做三步的工作即可:
1、實現模型類
2、爲控制器和視圖構建基架
3、選擇數據庫初始化策略
基架只是爲應用程序的特定部分提供了起點,在此基礎上可以根據自己的喜好做修改.