您的位置:首页 > 其它

Entity Framework4.0 (一)概述(EF4 的Database First方法)

2014-11-26 18:49 441 查看
本来想自己写一篇的,看到这篇文章之后,感觉博主写的很不错,转来分享给大家

原文地址:/article/5811266.html

个人观点:

(在我看来,EF这三种方案中 Database First 在做一些大型项目的时候比较使用,可以直接设计较复杂的数据库,以后在数据库改动扩展或者备份等都比较方便,这种方式大多数人操作起来应该也比较顺手 容易理解。。。有不同观点可以留言)

简述:

Entity Framework4.0(以后简称:EF4),是Microsoft的一款ORM(Object-Relation-Mapping)框架。同其它ORM(如,NHibernate,Hibernate)一样,一是为了使开发人员以操作对象的方式去操作关系型数据表。二是为了屏蔽底层不同厂商的数据库,开发人员面向ORM框架编写数据的CRUD(Create,Retrieve,Update,Delete)操作,再由ORM框架将这些操作翻译成不同数据库厂商的方言。

EF4较之前的版本有了很大的改观:

POCO(Plain Old CLR Objects)的支持:可以对含有业务逻辑的业务对象进行持久化、跟踪、状态管理等。
模型驱动开发:EF4提供三种方案:(1)先建立数据库与数据表,由数据库中的表生成业务模型。(2)先用设计器设计业务模型,由业务模型生成数据表。(3)纯代码的方式,不用设计器,而是自己实现接口与类,用以和数据库进行映射。这里的模型驱动就是指方案(2)。
关联对象的延迟加载:在以前的版本中不支持通过导航属性去自动加载关联对象,要使用include(),或显示Load()才可以。而在EF4中支持通过导航属性,去自动加载相关联的对象。
函数化调用数据库存储过程与自定义函数:数据库中的存储过程和自定义函数可以映射成ObjectContext对象的方法,在程序中直接调用。
自定义代码生成所且的模板与生成过程:EF4与T4结合使用可以控制生成代码的模板。EF4与WF(Windows Work Flow)结合使用可以控制生成代码的过程。
默认情况下:实体集采用复数,实体采用单数命名的形式:以前版本中实体集与实体的名字相同,让人感觉到困惑。现在EF4解决了这个bug。
复杂属性:如果一个属性只有一项内容,我们称该属性为标量属性(Scalar Property)。如果一个属性由多个标量属性组合而成,我们称组合以后的属性为复杂属性。如果一个实体中有复杂属性。在映射到数据表中时,则该复杂属性内部的每一个标量属性都会映射成一个独立的字段。

实例演示:

我们创建一个简单的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 代码如下:



1                // 方法一:我们使用循环遍历查询结果的集合元素,然后添加到控制中。
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事件响应代码如下:



1             // 方法一:我们使用循环遍历查询结果的集合元素,然后添加到控制中。
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             }


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: