code first基础
隨著.NET 4.0時代的到來,開發者越來越關注如何能加快開發效率,從而構建健壯的程序。而微軟在.NET 4.0推出的Entity Framework,無疑是值得開發者去學習的,它實際上是微軟的ADO.NET的增強版本,是個ORM框架。在本文中,將以例子的形式簡單介紹最新的 Entity Framework 4.1的基本用法。
介 紹
在舊的Entity 框架中,開發者可以從已存在的數據庫中產生業務實體的模型,這種開發方法被稱為數據庫驅動的開發方法。而在4.1的Entity Framework中,支開發者先創建實體業務類,然后再產生相關的數據庫文件,這種開發方法可以稱為“代碼先行”的開發方法。這種方法對于開發者來說是 很有好處的,首先,會讓開發者從面向對象的思維角度出發,去構建業務邏輯中的實體模型,然后再根據實際的需要去生成數據庫文件,是真正的面向對象的思維開 發方法。
本文中要使用Entity Framework 4.1,這里提供下載該框架安裝程序:Entity Framework 4.1。
同時,VS.NET 2010也是少不了的,而本文的配套代碼,可以在這里下載:VS.NET 2010。
本文的例子將會創建兩個類Invoice類和LineItem類。而本文產生的數據庫命名為Accounting,并會產生兩張表:Invoice和 LineItem。例子中的功能,還包括可以在gridview中對數據庫中的數據進行增刪改查,最后,還會演示如果類發生了變化了,如何讓相應的數據庫 也發生改變。
步驟1
1) 啟動vs.net 2010;
2) 新建立一個c#語言的asp.net web工程項目;
3) 將工程命名為project EF4CodeFirst;
4) 在工程資源管理器中,鼠標右鍵點擊,然后新增一個類,將新增的類命名為Invoice.cs。
修改這個類的代碼如下:
publicclass Invoice { publicint ID { get; set; } public DateTime InvoiceDate { get; set; } publicdouble Total { get; set; } }在我們的類中,有id這個屬性,Entity框架會根據id這個屬性,去生成數據庫表中的對應字段id,如果類中沒定義id這個屬性,則會在數據庫表文件中生成以“類文件名+ID”這樣命名的字段。
在這個Invoice發票類中,存在多個條目LineItem,它們之間明顯構成一對多的關系,所以我們先建立類LineItem類。
5) 同樣,新增一個LineItem類,代碼如下:
publicclass LineItem { publicint ID { get; set; } publicstring ProductName { get; set; } publicdouble ItemCost { get; set; } publicdouble Units { get; set; } public Invoice Invoice { get; set; } }在這個類中,維持了對Invoice類的引用,同時也是關聯了Invoice類。
6)而在Invoice類中,也要增加LineItem類的引用,這里要用到的是集合類,如下代碼:
public ICollection<LineItem> LineItems { get; set; }
同時要在Invovice類的構造函數中,進行初始化LineItem類,如下:
public Invoice() {LineItems =new List<LineItem>(); }在完成上面的步驟后,則Entity框架已可以從實體類中創建相關的數據庫和表了,下面繼續進行步驟二。
步驟2
接下來,我們要引用Entity框架的類庫文件到我們的工程中。
1) 在工程資源管理器中,鼠標右鍵點擊工程名字,在彈出的菜單中選擇“添加引用”。
2) 在出現的如下圖的界面中,選擇System.Data.Entity ,并點確定完成:
3) 為工程繼續增加一個新類,命名為Accounting.cs ,并且修改其代碼如下:
using System.Data.Entity; publicclass Accounting : DbContext {public Accounting() : base("Accounting"){}public override void OnModelCreating(DbModelBuilder modelBuilder){ base.OnModelCreating(modelBuilder);modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();}public DbSet<Invoice> Invoices { get; set; }public DbSet<LineItem> LineItems { get; set; } }可以看到,該類繼承了DbContext類,該類實際上是Entity的一個工具類,里面封裝了很多有用的API,在Accounting類中,分別有兩個DbSet類的實例,它們代表將要在數據庫中生成的兩個表。
構造函數繼承了積累構造函數,并將名為 “Accounting” 的連接字符串作為參數,以使用該字符串。如果不寫該構造函數,將自動使用與該DbContext同名的連接字符串,也就是 name="Accounting" 的鏈接字符串。
重寫OnModelCreating方法,增加 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 是為了在數據庫中生成表時,表名以單數形式出現,否則數據庫中表名為:Invoices,LineItems。
4)接著需要在web.config中進行添加數據庫連接,如下:
<add name="Accounting"
providerName="System.Data.SqlClient"
connectionString="Data Source=(local);Initial Catalog=Accounting;Integrated Security=SSPI;"/>
5) 接著,在default.aspx 中添加gridview控件,并且編寫如下代碼:
using System.Data.Entity; protectedvoid Page_Load(object sender, EventArgs e) { Accounting db =new Accounting(); db.Invoices.Load(); GridView1.DataSource = db.Invoices.Local.ToBindingList(); GridView1.DataBind(); }記得這里必須引入System.Data.Entity類庫,并且實例化Accounting對象的實例db,并調用其load方法,加載所有的Invoice數據(這里我們一般是加載一對多的一方的數據)。
6)運行工程后,你會發現在SQL SERVER中,會出現了三張表,如下圖:
其中,分別是Invoice表和LineItem表,還有一張表EdmMetadata,是Entity框架為我們自動生成的,保存了數據庫中的元數據。另外,可以看到在表LineItem中,Entity框架已經為我們自動生成了外鍵Invoice_ID,如下圖:
步驟三
現在,既然數據庫已經創建了,則可以為其增加一些數據了,在page_load中增加如下代碼:
protectedvoid Page_Load(object sender, EventArgs e) { Accounting db =new Accounting(); Invoice invoice =new Invoice { InvoiceDate = DateTime.Now, Total =1000 }; db.Invoices.Add(invoice); db.SaveChanges(); db.Invoices.Load(); GridView1.DataSource = db.Invoices.Local.ToBindingList(); GridView1.DataBind(); }在這里我們實例化了Invoice類的一個實例,添加了相關的數據內容,然后使用db.Invoices.Add增加到Account類的DBSet屬性中,最后調用savechanges方法保存到數據庫中,運行后,可以看到如下效果:
現在我們試下更新數據,代碼如下:
protectedvoid Page_Load(object sender, EventArgs e) { Accounting db =new Accounting(); Invoice invoice =new Invoice { ID =1, InvoiceDate = DateTime.Now, Total =900 }; db.Entry(invoice).State = EntityState.Modified; db.SaveChanges(); db.Invoices.Load(); GridView1.DataSource = db.Invoices.Local.ToBindingList(); GridView1.DataBind(); }這里把invoice實例的成員變量的ID改為1,注意在更新時,設置其狀態(state)為EntityState.Modified,表示是修改記錄,最后再保存,運行后,可以看到數據庫中的數據的確更新了,所有這些都是Entity 框架在起作用。
最后學習刪除記錄,代碼如下:
protectedvoid Page_Load(object sender, EventArgs e) { Accounting db =new Accounting(); Invoice invoice =new Invoice { ID =1, InvoiceDate = DateTime.Now, Total =900 }; db.Invoices.Remove(invoice); db.SaveChanges(); db.Invoices.Load(); GridView1.DataSource = db.Invoices.Local.ToBindingList(); GridView1.DataBind(); }這里只需要調用Remove方法,即可在數據庫中刪除該記錄。
步驟4
在這個步驟中,我們學習如何改變數據模型。假設我們要在Invoice類中增加一個Tax的屬性,也需要Entity框架同步在數據庫中增加這個字段,下面演示其步驟:
1)我們在Invoice類中增加Tax這個屬性。
2)如果這時運行工程,則會看到如下的錯誤提示:
The model backing the 'Accounting' context has changed since the database was
created. Either manually delete/update the database, or call
Database.SetInitializer with an IDatabaseInitializer instance. For example, the
DropCreateDatabaseIfModelChanges strategy will automatically delete and recreate
the database, and optionally seed it with new data.
提示告訴我們,或者這個時候重新手工刪除數據庫或者使用代碼的方法去完成,我們使用代碼的方法去完成,只需要在Application_Start事件中編碼如下,即可讓Entity框架,自動把新增加的屬性反映到數據庫中:
void Application_Start(object sender, EventArgs e) { // Code that runs on application startup System.Data.Entity.Database.SetInitializer<Accounting> (new System.Data.Entity.DropCreateDatabaseIfModelChanges<Accounting>()); }3) 再次運行工程,會看到數據表中的確增加了Tax這個字段了,如下圖:
步驟5
注意,在上面的步驟4中,如果類的屬性發生變化,則其實是通過代碼的方法,重新將舊的數據庫DROP掉,然后再新建,這樣的話費時費力,而可以通過另外的一個方法實現,即還好我們可以在初始化的過程中添加測試數據,這樣每次重新創建數據庫的時候,測試數據就會自動加進去了,算是解決了一些問題,方法如下:
1)在工程項目中,新增加一個類,命名為AccountingInitializer.cs
2)修改其代碼如下:
publicclass AccountingInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<Accounting> { protectedoverridevoid Seed(Accounting context) { Invoice invoice =new Invoice { Total =20, InvoiceDate = new DateTime(2011, 4, 14), Tax =1.50 }; invoice.LineItems.Add(new LineItem { ItemCost =2, ProductName ="Test", Units =4 }); invoice.LineItems.Add(new LineItem { ItemCost =4, ProductName ="Test 2", Units =3 }); context.Invoices.Add(invoice); context.SaveChanges(); base.Seed(context); } }其中,在這個類中繼承了DropCreateDatabaseIfModelChanges這個類,并且重寫了seed這個方法,在這個方法中可以編寫新增測試數據。要記得還需要在Application_OnStart事件中編寫如下代碼:
void Application_Start(object sender, EventArgs e)
{
//在啟動過程中執行該段代碼
System.Data.Entity.Database.SetInitializer<Accounting>
(new AccountingInitializer());
}
小 結
可以看到,Entity Framework 4.1的確方便了用戶的開發操作,能讓用戶更專注于業務邏輯實體的開發,更符合OOP的思維方式,更多關于Entity Framework的操作,請參考微軟的MSDN
轉載于:https://www.cnblogs.com/asks/p/4372790.html
總結
以上是生活随笔為你收集整理的code first基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (Lesson2)根据类名称和属性获得元
- 下一篇: android studio 模拟器中文