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

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

 

button1_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事件响应代码如下:

lboxCategory_SelectedIndexChanged
 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 }

 

简单的概述下EF4,先这样吧?实在是顶不住了,要休息了。。。

 

转载于:https://www.cnblogs.com/marksun/archive/2011/12/15/2289582.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 相关子查询使用【主表得数据需要扩展(统计数据依赖与其他表,但是与主表有关联)】...

2019独角兽企业重金招聘Python工程师标准>>> SELECT t.building,t.unit,t.room,t.ashcan ,(SELECT COUNT(a.resident_id) from t_address_book a where a.village_id t.village_id AND a.building t.building and a.room t.unit and a.house t.room and…

竟然被尤雨溪点赞了:我给Vue生态贡献代码的这一年

大家好,我是若川。最近组织了源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。这篇文章在知乎被尤雨溪…

java版电子商务spring cloud分布式微服务b2b2c社交电商(四)SpringBoot 整合JPA

b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六。JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA 的目标之一是制定一个可以由很多供应商实现的AP…

60款很酷的 jQuery 幻灯片演示和下载

jQuery 是一个非常优秀的 JavaScript 框架,使用简单灵活,同时还有许多成熟的插件可供选择,它可以帮助你在项目中加入漂亮的效果,其中之一就是幻灯片,一种在有限的网页空间内展示系列项目时非常好的方法。今天这篇文章要…

流体式布局与响应式布局_将固定像素设计转换为流体比例布局

流体式布局与响应式布局Responsive web design has been a prime necessity for every enterprise ever since Google announced that responsive, mobile-friendly websites will see a hike in their search engine rank in 2015.自Google宣布响应式,移动友好型网…

怎样开发一个 Node.js 命令行工具包

大家好,我是若川。最近组织了源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。源码共读活动很多都是读…

redis完全攻略

安装篇 声明:以下环境均是在ubuntu下进行 wget http://redis.googlecode.com/files/redis-2.4.4.tar.gztar zxf redis-2.4.4.tar.gz 然后进入目录后直接make就可以了、如果迩的系统是32位的那么执行 make 32bit 安装完成后、执行一下make test看是否正常、如果出现“…

印刷报价系统源码_皇家印刷术-设计系统案例研究

印刷报价系统源码重点 (Top highlight)Typography. It’s complicated. With Product Design, it’s on every screen. Decisions for a type scale affect literally every aspect of a product. When you’re working with an existing product, defining typography can fee…

Python简单试题3

1,水仙花数 水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身 (例如:1^3 5^3 3^3 153) 代码如下: 方法一: for i in range(100,1000): # 进行for循环num ia num % 10 # …

React Hooks 完全使用指南

大家好,我是若川。最近组织了源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。React HooksHook 是什么…

重新设计Videoland的登录页面— UX案例研究

In late October of 2019 me and our CRO lead Lucas, set up a project at Videoland to redesign our main landing page for prospect customers (if they already have a subscription, they will go to the actual streaming product).在2019年10月下旬,我和我…

【常见Web应用安全问题】---5、File Inclusion

Web应用程序的安全性问题依其存在的形势划分,种类繁多,这里不准备介绍所有的,只介绍常见的一些。 常见Web应用安全问题安全性问题的列表:   1、跨站脚本攻击(CSS or XSS, Cross Site Scripting)   2、S…

全新的 Vue3 状态管理工具:Pinia

大家好,我是若川。最近组织了源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。Vue3 发布已经有一段时间…

JS中变量和函数的使用

一、变量的介绍 1、啥是变量? 变量的本质是一块有名字的内存空间。变量由变量名和变量值构成。变量名指的是内存空间的别名,一般位于赋值运算符的左边;而变量值指的是内存空间中的数据,一般位于赋值运算符的右边。例如:var balanc…

Win32 API消息函数:GetMessagePos

Win32 API消息函数:GetMessagePos 函数功能:该函数返回表示屏幕坐标下光标位置的长整数值。此位置表示当上一消息由GetMessage取得时鼠标占用的点。 函数原型:DWORD GetMessagePos(VOID) 参数:无。 返回值&…

都快 2022 年了,这些 Github 使用技巧你都会了吗?

大家好,我是若川。最近组织了源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。最近经常有小伙伴问我如…

单线程+异步协程

一 . 线程池和进程池 可以适当的使用,在大量的IO情况下有更好的方法 import time from multiprocessing.dummy import Pool def request(url):print(正在下载->,url)time.sleep(2)print(下载完毕->,url) start time.time() urls [www.baidu.com,www.taobao.com,www.sou…

Repeater\DataList\GridView实现分页,数据编辑与删除

一、实现效果 1、GridView 2、DataList 3、Repeater 二、代码 1、可以去Csdn资源下载,包含了Norwind中文示例数据库噢!(放心下,不要资源分) 下载地址:数据控件示例源码Norwind中文数据库 2、我的开发环境&a…

网站快速成型_我的老板对快速成型有什么期望?

网站快速成型Some of the top excuses I have gotten from clients when inviting them into a prototyping session are: “I am not a designer!” “I can’t draw!” “I have no creative background!”在邀请客户参加原型制作会议时,我从客户那里得到的一些主…

碎片化学前端,融入到积极上进的环境,我推荐~

众所周知,关注公众号可以了解学习掌握技术方向,学习优质好文,落实到自己项目中。还可以结交圈内好友,让自己融入到积极上进的技术氛围,促进自己的技术提升。话不多说,推荐这些优质前端公众号前端之神 80w阅…