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

时间:2022-09-19 20:47:48

转自:http://www.cnblogs.com/marksun/archive/2011/12/15/2289582.html

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)。如果一个属性由多个标量属性组合而成,我们称组合以后的属性为复杂属性。如果一个实体中有复杂属性。在映射到数据表中时,则该复杂属性内部的每一个标量属性都会映射成一个独立的字段。

在“概述”部分,我会用三篇博文简单演示使用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 . 如下图:

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

在EFDemo项目上右键选择Add->New Item。选择ADO.Net Entity Data Model.在名称框中输入:Northwind,点击add.

选择“generate from database” 点击 next. 如下图:

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

选择数据库服务器,和数据表。大家对这个应该都不陌生。这里会生成一个连接字符串(用于连接到数据库),并保存到配置文件内。 如下图:

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

那个Tables,我们选择Categories, Products 两个表。勾选 :Pluralize or singularize generated object names 和 Include foreign key columns in model.

Namespace 你可以自己设定,我们这里使用默认值。点击Finish.如下图:

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

EF4生成的实体图,如下:

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

设计winForm 窗体如下:

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

运行后,当点击:InitListBox 按钮后,填充lboxCategory ,当在lboxCategory 中选择时,会在lboxProduct中显示该类别下的所有产品。如下图:

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

在以下两个事件处理代码中:如果要么都使用方法一,要么都使用方法二。两种方法我更推荐使用方法二,因为它的效率更好。这里给出方法一是想要演示下连接(join)的使用。

在InitLixtBox 的click 代码如下:

// 方法一:我们使用循环遍历查询结果的集合元素,然后添加到控制中。
//this.lboxCategory.Items.Clear();
//using (NorthwindEntities context = new NorthwindEntities())
//{
// var categories = from category in context.Categories
// select new { category.CategoryID,category.CategoryName }; // foreach (var c in categories)
// {
// this.lboxCategory.Items.Add(c.CategoryName);
// }
//} // 方法二:该方法是指定数据源的方式。不须要用 this.lboxCategory.Items.Clear();
// 来清理上次展示的结果。当再次指定数据源以后,控制显示的即是最新的数据信息。
using (NorthwindEntities context = new NorthwindEntities())
{
var categories = from category in context.Categories
select new { category.CategoryID, category.CategoryName }; // 注意:给控件指定数据源的时候,对DataSource的赋值语句要在DisplayMember和ValueMember赋值之后,
// 否则,DisplayMember和ValueMember的赋值不生效。
this.lboxCategory.DisplayMember = "CategoryName";
this.lboxCategory.ValueMember = "CategoryID";
this.lboxCategory.DataSource = categories; }

lbCategory的select index change事件响应代码如下:

// 方法一:我们使用循环遍历查询结果的集合元素,然后添加到控制中。
//this.lboxProduct.Items.Clear();
//if (this.lboxCategory.SelectedItem != null)
//{
// string categoryName = this.lboxCategory.SelectedItem.ToString();
// 这次直接使用CategoryName作筛选条件,需要使用连接(join),因为Product中只包含有CategoryID,而没有CategoryName。
// using (NorthwindEntities context = new NorthwindEntities())
// {
// var products = from product in context.Products
// join category in context.Categories on product.CategoryID equals category.CategoryID
// where category.CategoryName == categoryName
// select new { product.ProductName }; // foreach (var p in products)
// {
// this.lboxProduct.Items.Add(p.ProductName);
// }
// }
//} // 方法二:该方法是指定数据源的方式。不须要用 this.lboxProduct.Items.Clear();
if (this.lboxCategory.SelectedValue != null)
{
// 得到类别ID号
int categoryID = Convert.ToInt32(this.lboxCategory.SelectedValue.ToString()); // 这次直接使用CategoryID作筛选条件,不需要使用连接(join),因为Product中包含有CategoryID。
using (NorthwindEntities context = new NorthwindEntities())
{
var products = from product in context.Products
where product.CategoryID == categoryID
select new { product.ProductName }; // 注意:给控制指定数据源的时候,对DataSource的赋值语句要在DisplayMember和ValueMember赋值之后,
// 否则,DisplayMember和ValueMember的赋值不生效。
this.lboxProduct.DisplayMember = "ProductName";
this.lboxProduct.DataSource = products;
}
}

Entity Framework4.0 (一)概述(EF4 的Database First方法)的更多相关文章

  1. [转]Entity Framework4.0 (七) EF4的存储过程

    本文转自:http://www.cnblogs.com/marksun/archive/2011/12/21/2296500.html 前面了解了EF4的CRUD的操作,你会发现EF4使用起来比较简单 ...

  2. Entity Framework4.0 (七) EF4的存储过程

    前面了解了EF4的CRUD的操作,你会发现EF4使用起来比较简单的.呵呵,之前我们使用数据库的时候,有时会使用存储过程代替在代码中直接使用SQL语句. 使用存储过程的好处: 提高效率:因为存储过程是经 ...

  3. Entity Framework4.0 (六) EF4的 增加、删除、更改

    前面介绍了EF4的查询功能,主要是借助于LINQ的强大的查询功能和它简单的语法.让我们可以完全面向对象集体去进行查询,而不必去劳心处理那些关系型数据库表的操作.这样我们更容易把主要精力集中在业务逻辑上 ...

  4. VS2010+Oracle11+Entity Framework4.1环境搭建及常见问题(转)

    一,开场白: 在微软的实体数据模型中存在四种查询方式:SQL字符串:Linq:Linq to SQL:Linq to Entity(ESQL) 对于Linq SQL目前微软虽然仍在支持,但微软已经声明 ...

  5. EF5.0区别于EF4.0的crud区别

    public T AddEntity(T entity) { //EF4.0的写法 添加实体 //db.CreateObjectSet<T>().AddObject(entity); // ...

  6. EF5&period;0区别于EF4&period;0的增删改写法

    // 实现对数据库的添加功能,添加实现EF框架的引用 public T AddEntity(T entity) { //EF4.0的写法 添加实体 //db.CreateObjectSet<T& ...

  7. VS2010&plus;Oracle11&plus;Entity Framework4&period;1环境搭建及常见问题

    在微软的实体数据模型中存在四种查询方式: SQL字符串:Linq:Linq to SQL:Linq to Entity(ESQL) 对于Linq SQL目前微软虽然仍在支持,但微软已经声明不再推荐. ...

  8. Windows Server2008 下用于&period;NET Framework3&period;0版本的问题无法在IIS7中配置&period;NET Framework4&period;0节点的问题

    Windows Server 2008中,功能列表安装的为.NET Framework3.0. 试了N种方法未升级为.NET Framework4.0(哪位如果可以直接升级为4.0或3.5希望能够分享 ...

  9. 怎么解决xp系统不能安装NET Framework4&period;0&quest;

    第一步: 如果是XP系统: 1.开始——运行——输入cmd——回车——在打开的窗口中输入net stop WuAuServ 2.开始——运行——输入%windir% 3.在打开的窗口中有个文件夹叫So ...

随机推荐

  1. Hibernate&lpar;十&rpar;&lowbar;&lowbar;缓存机制

    为什么需要缓存? 缓存的作用主要用来提高性能,可以简单的理解成一个Map: 使 用缓存涉及到三个操作:把数据放入缓存.从缓存中获取数据. 删除缓存中的无效数据. 从上图看出: 当我们去查询对象的时候, ...

  2. c&num;基础-oop&lpar;面向对象理解&rpar;

    OOP-面向对象 封装,继承多态 一个桌子,用面向对象来描述一下它这个桌子项目 定义桌子类 对象:桌子 桌子的属性:名字,材质,体积 桌子的方法;放东西(方法) 现在桌子要放书,放花瓶,放文件(这里就 ...

  3. 【Android】混淆器(ProGuard)

    混淆器(ProGuard) 混淆器通过删除从未用过的代码和使用晦涩名字重命名类.字段和方法,对代码进行压缩,优化和混淆.结果是一个比较小的.apk文件,该文件比较难进行逆向工程.因此,当你的应用程序对 ...

  4. Oracle的spool命令

    在控制台上使用spool 路径+文件名 命令可以将整个过程写入指定的文件中, 结束使用spool off 命令, 当执行spool off后文件中的内容才能看见; ed命令修改当前缓冲区的上一条命令;

  5. 递归 与 js 对象的引用

    <script> //递归 function test(n) { if (n == 1) { return 1 } console.log(n) return n * test(n - 1 ...

  6. sql2000

    sql 2000简体中文企业版下载(含SP3 SP4 下载地址)安装图解及sp4安装教程图解 2012-07-17 16:24:37|  分类: mssql数据库|字号 订阅     sql 2000 ...

  7. python操作redis-事务

    #!/usr/bin/python #!coding: utf-8 import redis import sys if __name__=="__main__": try: co ...

  8. day 4 - 1 列表

    1.列表的增删改查 1) append insert extend li = ["ysg",[1,2,3,4,5],"peipei","梦幻&quot ...

  9. JDBC 与 Bean Shell的使用(二)获取值,并且断言

    这里我们使用的断言方式是BeanShell断言,做一个新增功能的接口测试, 1.发一个post请求,新增测试数据,然后做一个返回数据的响应断言-------大部分人都可以实现这个功能 2.如果是后台业 ...

  10. 51、自定义View基础和原理

    一.编写自己的自定义View最简单的自定义View,继承View通过覆盖View的onDraw方法来实现自主显示利用Canvas和paint来绘制显示元素(文字,几何图形等) <com.myvi ...