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)框架。

转自: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;
                }
            }

 

相关文章
|
数据库 数据库管理 数据库连接
Entity Framework 6.1-Database First介绍
原文: Entity Framework 6.1-Database First介绍 这种方式是比较传统的以数据库为核心的开发模式。比较适合有数据库DBA的团队、或者数据库已存在的情况。
1051 0
|
7月前
|
SQL Oracle 关系型数据库
WARNING: Too Many Parse Errors With error=911 When Running a JDBC Application Connected to an Oracle 19c database
WARNING: Too Many Parse Errors With error=911 When Running a JDBC Application Connected to an Oracle 19c database (
96 2
|
7月前
|
Oracle 关系型数据库
19c 开启Oracle Database Vault
19c 开启Oracle Database Vault
168 1
|
7月前
|
SQL Oracle 关系型数据库
Connect to Autonomous Database Using Oracle Database Tools
Connect to Autonomous Database Using Oracle Database Tools
64 1
|
6月前
|
Oracle 关系型数据库 Linux
Requirements for Installing Oracle Database/Client 19c on OL8 or RHEL8 64-bit (x86-64) (Doc ID 2668780.1)
Requirements for Installing Oracle Database/Client 19c on OL8 or RHEL8 64-bit (x86-64) (Doc ID 2668780.1)
54 0
|
7月前
|
人工智能 Oracle 关系型数据库
一篇文章弄懂Oracle和PostgreSQL的Database Link
一篇文章弄懂Oracle和PostgreSQL的Database Link
|
7月前
|
SQL Oracle 安全
Oracle Database Vault Access Control Components
Oracle Database Vault Access Control Components
58 0
|
7月前
|
Oracle 安全 关系型数据库
What Is Oracle Database Vault?
The Oracle Database Vault security controls protect application data from unauthorized access, and helps you to comply with privacy and regulatory requirements. You can deploy controls to block privileged account access to application data and control sensitive operations inside the database using
42 0
|
7月前
|
Oracle 关系型数据库 Linux
服务器Centos7 静默安装Oracle Database 12.2
服务器Centos7 静默安装Oracle Database 12.2
288 0
|
7月前
|
Oracle 关系型数据库 数据库
windows Oracle Database 19c 卸载教程
打开任务管理器 ctrl+Shift+Esc可以快速打开任务管理器,找到oracle所有服务然后停止。 停止数据库服务 在开始卸载之前,确保数据库服务已经停止。你可以使用以下命令停止数据库服务: net stop OracleServiceORCL Universal Installer 卸载Oracle数据库程序 一般情况运行Oracle自带的卸载程序,如使用Universal Installer 工具卸载。 点击开始菜单找到Oracle,然后点击Oracle安装产品,再点击Universal Installer。 点击之后稍等一会然后会进入进入下图界面,点击卸载产品。 选中要删除的Orac
677 1