Entity Framework4.0 (一)概述(EF4 的Database First方法)
Entity Framework4.0(以后簡稱:EF4),是Microsoft的一款ORM(Object-Relation-Mapping)框架。同其它ORM(如,NHibernate,Hibernate)一樣,一是為了使開發(fā)人員以操作對(duì)象的方式去操作關(guān)系型數(shù)據(jù)表。二是為了屏蔽底層不同廠商的數(shù)據(jù)庫,開發(fā)人員面向ORM框架編寫數(shù)據(jù)的CRUD(Create,Retrieve,Update,Delete)操作,再由ORM框架將這些操作翻譯成不同數(shù)據(jù)庫廠商的方言。
EF4較之前的版本有了很大的改觀:
- POCO(Plain Old CLR Objects)的支持:可以對(duì)含有業(yè)務(wù)邏輯的業(yè)務(wù)對(duì)象進(jìn)行持久化、跟蹤、狀態(tài)管理等。
- 模型驅(qū)動(dòng)開發(fā):EF4提供三種方案:(1)先建立數(shù)據(jù)庫與數(shù)據(jù)表,由數(shù)據(jù)庫中的表生成業(yè)務(wù)模型。(2)先用設(shè)計(jì)器設(shè)計(jì)業(yè)務(wù)模型,由業(yè)務(wù)模型生成數(shù)據(jù)表。(3)純代碼的方式,不用設(shè)計(jì)器,而是自己實(shí)現(xiàn)接口與類,用以和數(shù)據(jù)庫進(jìn)行映射。這里的模型驅(qū)動(dòng)就是指方案(2)。
- 關(guān)聯(lián)對(duì)象的延遲加載:在以前的版本中不支持通過導(dǎo)航屬性去自動(dòng)加載關(guān)聯(lián)對(duì)象,要使用include(),或顯示Load()才可以。而在EF4中支持通過導(dǎo)航屬性,去自動(dòng)加載相關(guān)聯(lián)的對(duì)象。
- 函數(shù)化調(diào)用數(shù)據(jù)庫存儲(chǔ)過程與自定義函數(shù):數(shù)據(jù)庫中的存儲(chǔ)過程和自定義函數(shù)可以映射成ObjectContext對(duì)象的方法,在程序中直接調(diào)用。
- 自定義代碼生成所且的模板與生成過程:EF4與T4結(jié)合使用可以控制生成代碼的模板。EF4與WF(Windows Work Flow)結(jié)合使用可以控制生成代碼的過程。
- 默認(rèn)情況下:實(shí)體集采用復(fù)數(shù),實(shí)體采用單數(shù)命名的形式:以前版本中實(shí)體集與實(shí)體的名字相同,讓人感覺到困惑。現(xiàn)在EF4解決了這個(gè)bug。
- 復(fù)雜屬性:如果一個(gè)屬性只有一項(xiàng)內(nèi)容,我們稱該屬性為標(biāo)量屬性(Scalar Property)。如果一個(gè)屬性由多個(gè)標(biāo)量屬性組合而成,我們稱組合以后的屬性為復(fù)雜屬性。如果一個(gè)實(shí)體中有復(fù)雜屬性。在映射到數(shù)據(jù)表中時(shí),則該復(fù)雜屬性內(nèi)部的每一個(gè)標(biāo)量屬性都會(huì)映射成一個(gè)獨(dú)立的字段。
在“概述”部分,我會(huì)用三篇博文簡單演示使用EF4創(chuàng)建應(yīng)用的方法。目的就為了先給大家展示EF4的一個(gè)整體形象,避免過于關(guān)注細(xì)節(jié),而看不清其全貌。博客園里我看到已經(jīng)有許多講EF4的博文,講得都很好。但我覺得講得有點(diǎn)太深入了,而且知識(shí)點(diǎn)過度有些陡峭了:不利于EF4新手理解和學(xué)習(xí)。國內(nèi)也沒有EF4的相關(guān)書籍可供大家細(xì)致地學(xué)習(xí)參考。所以,我就盡量寫一些對(duì)大家有用的、簡單的、過渡性的博文。避開晦澀難改的技術(shù)術(shù)語,讓大家快速入門,然后在具體使用中自己深入研究。
EF4支持三種構(gòu)建方法:1. Database First方法。2.Model First方法。3.Code First 方法。開發(fā)人員可根據(jù)具體的項(xiàng)目情況,選擇任一種方法。為了盡量把每種方法的詳細(xì)步驟講述連貫,前三篇博文暫不深入解釋。我會(huì)在后續(xù)章節(jié)中逐步展開和深入EF4的內(nèi)部機(jī)理和相關(guān)知識(shí)。
好了,不多說了。下面言歸正傳。這次我們就簡單演示下:1. Database First方法。
=========================================================================
我們創(chuàng)建一個(gè)簡單的Windows Form的小示例:以Northwind數(shù)據(jù)庫為例。
首先,創(chuàng)建EFDemo windForm Application . 如下圖:
在EFDemo項(xiàng)目上右鍵選擇Add->New Item。選擇ADO.Net Entity Data Model.在名稱框中輸入:Northwind,點(diǎn)擊add.
選擇“generate from database” 點(diǎn)擊 next. 如下圖:
選擇數(shù)據(jù)庫服務(wù)器,和數(shù)據(jù)表。大家對(duì)這個(gè)應(yīng)該都不陌生。這里會(huì)生成一個(gè)連接字符串(用于連接到數(shù)據(jù)庫),并保存到配置文件內(nèi)。 如下圖:
那個(gè)Tables,我們選擇Categories, Products 兩個(gè)表。勾選 :Pluralize or singularize generated object names 和 Include foreign key columns in model.
Namespace 你可以自己設(shè)定,我們這里使用默認(rèn)值。點(diǎn)擊Finish.如下圖:
EF4生成的實(shí)體圖,如下:
設(shè)計(jì)winForm 窗體如下:
運(yùn)行后,當(dāng)點(diǎn)擊:InitListBox 按鈕后,填充lboxCategory ,當(dāng)在lboxCategory 中選擇時(shí),會(huì)在lboxProduct中顯示該類別下的所有產(chǎn)品。如下圖:
?
在以下兩個(gè)事件處理代碼中:如果要么都使用方法一,要么都使用方法二。兩種方法我更推薦使用方法二,因?yàn)樗男矢谩_@里給出方法一是想要演示下連接(join)的使用。
在InitLixtBox 的click 代碼如下:
?
button1_Click 1 // 方法一:我們使用循環(huán)遍歷查詢結(jié)果的集合元素,然后添加到控制中。2 //this.lboxCategory.Items.Clear();
3 //using (NorthwindEntities context = new NorthwindEntities())
4 //{
5 // var categories = from category in context.Categories
6 // select new { category.CategoryID,category.CategoryName };
7
8 // foreach (var c in categories)
9 // {
10 // this.lboxCategory.Items.Add(c.CategoryName);
11 // }
12 //}
13
14 // 方法二:該方法是指定數(shù)據(jù)源的方式。不須要用 this.lboxCategory.Items.Clear();
15 // 來清理上次展示的結(jié)果。當(dāng)再次指定數(shù)據(jù)源以后,控制顯示的即是最新的數(shù)據(jù)信息。
16 using (NorthwindEntities context = new NorthwindEntities())
17 {
18 var categories = from category in context.Categories
19 select new { category.CategoryID, category.CategoryName };
20
21 // 注意:給控件指定數(shù)據(jù)源的時(shí)候,對(duì)DataSource的賦值語句要在DisplayMember和ValueMember賦值之后,
22 // 否則,DisplayMember和ValueMember的賦值不生效。
23 this.lboxCategory.DisplayMember = "CategoryName";
24 this.lboxCategory.ValueMember = "CategoryID";
25 this.lboxCategory.DataSource = categories;
26
27 }
?
lbCategory的select index change事件響應(yīng)代碼如下:
lboxCategory_SelectedIndexChanged 1 // 方法一:我們使用循環(huán)遍歷查詢結(jié)果的集合元素,然后添加到控制中。2 //this.lboxProduct.Items.Clear();
3 //if (this.lboxCategory.SelectedItem != null)
4 //{
5 // string categoryName = this.lboxCategory.SelectedItem.ToString();
6 // 這次直接使用CategoryName作篩選條件,需要使用連接(join),因?yàn)镻roduct中只包含有CategoryID,而沒有CategoryName。
7 // using (NorthwindEntities context = new NorthwindEntities())
8 // {
9 // var products = from product in context.Products
10 // join category in context.Categories on product.CategoryID equals category.CategoryID
11 // where category.CategoryName == categoryName
12 // select new { product.ProductName };
13
14 // foreach (var p in products)
15 // {
16 // this.lboxProduct.Items.Add(p.ProductName);
17 // }
18 // }
19 //}
20
21 // 方法二:該方法是指定數(shù)據(jù)源的方式。不須要用 this.lboxProduct.Items.Clear();
22 if (this.lboxCategory.SelectedValue != null)
23 {
24 // 得到類別ID號(hào)
25 int categoryID = Convert.ToInt32(this.lboxCategory.SelectedValue.ToString());
26
27 // 這次直接使用CategoryID作篩選條件,不需要使用連接(join),因?yàn)镻roduct中包含有CategoryID。
28 using (NorthwindEntities context = new NorthwindEntities())
29 {
30 var products = from product in context.Products
31 where product.CategoryID == categoryID
32 select new { product.ProductName };
33
34 // 注意:給控制指定數(shù)據(jù)源的時(shí)候,對(duì)DataSource的賦值語句要在DisplayMember和ValueMember賦值之后,
35 // 否則,DisplayMember和ValueMember的賦值不生效。
36 this.lboxProduct.DisplayMember = "ProductName";
37 this.lboxProduct.DataSource = products;
38 }
39 }
?
簡單的概述下EF4,先這樣吧?實(shí)在是頂不住了,要休息了。。。
?
轉(zhuǎn)載于:https://www.cnblogs.com/marksun/archive/2011/12/15/2289582.html
總結(jié)
以上是生活随笔為你收集整理的Entity Framework4.0 (一)概述(EF4 的Database First方法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个c++ 2d图形引擎 AGG
- 下一篇: Camparable与Comparato