Entity Framework4.0(以后简称:EF4),是Microsoft的一款ORM(Object-Relation-Mapping)框架。同其它 ORM(如,NHibernate,Hibernate)一样,一是为了使开发人员以操作对象的方式去操作关系型数据表。二是为了屏蔽底层不同厂商的数据 库,开发人员面向ORM框架编写数据的CRUD(Create,Retrieve,Update,Delete)操作,再由ORM框架将这些操作翻译成不 同数据库厂商的方言。
EF4较之前的版本有了很大的改观:
在“概述”部分,我会用三篇博文简单演示使用EF4创建应用的方法。目的就为了先给大家展示EF4的一个整体形象,避免过于关注细节,而看不清其全 貌。博客园里我看到已经有许多讲EF4的博文,讲得都很好。但我觉得讲得有点太深入了,而且知识点过度有些陡峭了:不利于EF4新手理解和学习。国内也没 有EF4的相关书籍可供大家细致地学习参考。所以,我就尽量写一些对大家有用的、简单的、过渡性的博文。避开晦涩难改的技术术语,让大家快速入门,然后在 具体使用中自己深入研究。
EF4支持三种构建方法:1. Database First方法。2.Model First方法。3.Code First 方法。开发人员可根据具体的项目情况,选择任一种方法。为了尽量把每种方法的详细步骤讲述连贯,前三篇博文暂不深入解释。我会在后续章节中逐步展开和深入 EF4的内部机理和相关知识。
好了,不多说了。下面言归正传。这次我们就简单演示下:1. Database First方法。
=========================================================================
我们创建一个简单的Windows Form的小示例:以Northwind数据库为例。
首先,创建EFDemo windForm Application . 如下图:
在EFDemo项目上右键选择Add->New Item。选择ADO.Net Entity Data Model.在名称框中输入:Northwind,点击add.
选择“generate from database” 点击 next. 如下图:
选择数据库服务器,和数据表。大家对这个应该都不陌生。这里会生成一个连接字符串(用于连接到数据库),并保存到配置文件内。 如下图:
那个Tables,我们选择Categories, Products 两个表。勾选 :Pluralize or singularize generated object names 和 Include foreign key columns in model.
Namespace 你可以自己设定,我们这里使用默认值。点击Finish.如下图:
EF4生成的实体图,如下:
设计winForm 窗体如下:
运行后,当点击:InitListBox 按钮后,填充lboxCategory ,当在lboxCategory 中选择时,会在lboxProduct中显示该类别下的所有产品。如下图:
在以下两个事件处理代码中:如果要么都使用方法一,要么都使用方法二。两种方法我更推荐使用方法二,因为它的效率更好。这里给出方法一是想要演示下连接(join)的使用。
在InitLixtBox 的click 代码如下:
// 方法一:我们使用循环遍历查询结果的集合元素,然后添加到控制中。 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 // 方法二:该方法是指定数据源的方式。不须要用 this.lboxCategory.Items.Clear(); 15 // 来清理上次展示的结果。当再次指定数据源以后,控制显示的即是最新的数据信息。 16 using (NorthwindEntities context = new NorthwindEntities()) 17 { 18 var categories = from category in context.Categories 19 select new { category.CategoryID, category.CategoryName }; 20 21 // 注意:给控件指定数据源的时候,对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事件响应代码如下:
// 方法一:我们使用循环遍历查询结果的集合元素,然后添加到控制中。 2 //this.lboxProduct.Items.Clear(); 3 //if (this.lboxCategory.SelectedItem != null) 4 //{ 5 // string categoryName = this.lboxCategory.SelectedItem.ToString(); 6 // 这次直接使用CategoryName作筛选条件,需要使用连接(join),因为Product中只包含有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 // 方法二:该方法是指定数据源的方式。不须要用 this.lboxProduct.Items.Clear(); 22 if (this.lboxCategory.SelectedValue != null) 23 { 24 // 得到类别ID号 25 int categoryID = Convert.ToInt32(this.lboxCategory.SelectedValue.ToString()); 26 27 // 这次直接使用CategoryID作筛选条件,不需要使用连接(join),因为Product中包含有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 // 注意:给控制指定数据源的时候,对DataSource的赋值语句要在DisplayMember和ValueMember赋值之后, 35 // 否则,DisplayMember和ValueMember的赋值不生效。 36 this.lboxProduct.DisplayMember = "ProductName"; 37 this.lboxProduct.DataSource = products; 38 } 39 }
简单的概述下EF4,先这样吧?实在是顶不住了,要休息了。。。