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

转自: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 . 如下图:

在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 代码如下:

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

 

时间: 2024-10-14 15:16:01

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

一起谈.NET技术,利用.NET Framework4.0的源代码调试你的应用程序

相关文章:利用ASP.NET MVC源代码调试你的应用程序 .NET Framework 的部分源代码是开源的.这些源代码可以供我们学习和参考.也可在也平时调试应用,直接跳入这些开源了的.NET Framework的代码中.这样既可以学习MS放出来的代码,又可以帮助自己调试.下面我用一个WPF的简单的例子演示一下. 新建一个WPF应用程序,拖一个button,后台代码弹出一个messagebox就行了. private void button1_Click(object sender, Rout

在Framework4.0中如何实现延迟加载

延迟加载,亦称延迟实例化,延迟初始化等,主要表达的思想是,把对象的创建将会延迟到使用时创建,而不是在对象实例化时创建对象,即用时才加载.这种方式有助于提高于应用程序的性能,避免浪费计算,节省内存的使用等.针对于这种做法,似乎称之为即用即创建更为合适些. 先来看一下在Framework4.0中如何实现延迟加载. Framework4.0提供了一个包装类 Lazy,可以轻松的实现延迟加载. ///这行代码表明:要创建一个延迟加载的字符串对象s   ///原型为LazyT> 对象名=new LazyT

Win7系统安装.net framework4.0后电脑蓝屏怎么办?

Win7系统安装.net framework4.0后电脑蓝屏怎么办?   1.如果电脑一直蓝屏进不去,则重启后按F8然后进安全模式卸载.net framework4.0; 2.如果可以进系统,那么尝试更新Windows7系统驱动,特别是显卡驱动程序(显卡驱动和.net framework4.0关系最大).

RIA主流技术——Flex 3.0技术概述

问题描述 RIA主流技术--Flex3.0技术概述RIA富媒体开发应用很早就出现了.但真正兴起是2007年的事情.2007的网络视频的飞速发展,掀开RIA大规模应用的开始.而2008年号称是RIA应用年.在RIA开发技术中,以Adobe的Flex技术和微软的Siverlight为首.而发展最成熟的是Flex技术.现在Adobe推出功能更强大的最新版本Flex3.0.本人跟踪Flex技术多年,深刻体验Flex1.5.2.0版本.经过一年的准备和写作,终于完成这本书.这本书从基础讲解,剖析Flex3

winform打包程序,安装时要安装framework4.0框架才能运行

问题描述 请问下有没有其它方法编译winform程序,感觉这样安装太慢了,一个几百K的东西,要附带个几十兆的框架! 解决方案 解决方案二:引用楼主zzh_kankan的回复: 请问下有没有其它方法编译winform程序,感觉这样安装太慢了,一个几百K的东西,要附带个几十兆的框架! 可选择其他开发工具.解决方案三:打包时只能把框架也打包进去,不然客户端无法运气的,小弟学浅.帮lz顶下.期待高手解决方案四:也不是经常开发这种c/s的,其它语言没有.net熟悉,东西已经基本完成了!解决方案五:知道安装

Yii2实现log输出到file及database的方法

本文实例讲述了Yii2实现log输出到file及database的方法.分享给大家供大家参考,具体如下: 编辑config/web.php 首先log要开启 'bootstrap' => [ 'log' ], [file] 'components' => [ 'log' => [ 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'exportInterval' => 1, ], ], ], ] 默认输出到runtime

java5.0以后才有的可变参数的方法

java5.0以后才有的可变参数的方法,形式如下: 方法名(数据类型 ...数据的引用名) ,数据类型可以为 自定义的类和原始类型, 以及某些系统自带类(例如:String ), 现在我们声明一个自定义的用户类 Java代码 package lyx.com.cn; @SuppressWarnings("serial") public class User implements java.io.Serializable{ public int age; public String nam

C#3.0笔记(三)var关键字与扩展方法

从这篇blog开始真正开始关心3.0里面的特性,本篇主要介绍下Var关键字与 扩展方法. 初识var关键字 C#3.0中为我们提供了var关键字来定 义隐式化的局部变量,定义方式: var i = 0; var myBool = true; var myString = "Henllyee"; 其实在使用var关键字时,编译器会根据 初始化变量的变量值来推断变量的数据类型,我们可以通过IL来看下上面几句代 码在编译之后的表示: .locals init ([0] int32 i, [1

DW8.0不能保存FTP密码的解决方法

dw8.0不能保存ftp密码的解决方法 dw8的ftp功能很强大,但是.. 每次使用dw8设置好ftp账号会自动勾选保存,在使用该设置连接,只要不关闭dw8,无论断开重连多少次,程序的保存设置都是正常的 但是,一旦关闭dw8,再次启动并重新连接服务器,便会提示ftp账号出错.进入账号管理,该账号密码均被清空,等于保存无效. 可是切换到其他非当前工作站点的管理时,会发现其他的ftp账号均是正常. 关于以上问题,今天终于解决了. 早期使用dw8还是正常的,可以判定原程序是没问题的,或许是清理系统时删