ORM框架:Entity Framework

摘要:
之前NET 3.5,我们经常编写ADO。NET代码,用于在基础数据库中保存或检索数据。2008年,微软发布了ADO。NET实体框架。NET Framework 3.5 SP1,一个具有图形设计器的面向实体的数据库访问框架,用于执行所有上述与数据库相关的活动。EntityFramework是Microsoft基于ADO.NET开发的对象关系映射解决方案。它负责数据实例化,并将EntityClientDataProvider(下一层)的数据转换为实体对象。
ORM框架:Entity Framework

1.Entity Framework的概念

什么是ORM

对象-关系映射(Object/Relational Mapping,简称ORM),用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样在具体的操作实体对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作实体对象的属性和方法。即用操作对象的方式来操作数据库。

其它ORM框架:Dapper、NHibernate等。

Entity Framework介绍

在.NET3.5之前,我们经常编写ADO.NET代码来保存或检索底层数据库中的数据。做法是:打开过一个数据库的连接,创建一个DataSet来获取或提交数据到数据库,通过将DataSet中的数据和.NET对象相互转换来满足业务需求。这是一个麻烦且容易出错的过程。微软在2008年随.NET Framework 3.5 SP1发布了ADO.NET Entity Framework,一个附带有图形化设计器的面向实体数据库访问框架,用于执行所有上述与数据库相关的活动。

EF是一个适用于.NET开发的开源ORM框架。它使开发人员能够通过领域对象来处理数据,而无需关注存储此数据的基础数据库。使用实体框架,开发人员在处理数据时可以在更高的抽象级别上工作,并且与传统应用程序相比,可以使用更少的代码创建和维护面向数据的应用程序。

Entity Framework是微软以ADO.NET为基础所发展出来的对象关系映射(O/R Mapping)解决方案。该框架曾经为.NET Framework的一部分,但Version 6之后从.NET Framework分离出来,可通过NuGet获取。

Entity Framework利用抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (Entity),而数据字段都转换为属性 (Property),关系则转换为结合属性 (Association),让数据库的E/R(实体-联系图)模型完全的转成对象模型,让程序设计师能用最熟悉的编程语言来调用访问。

2. Entity Framework使用说明

1.EF支持SQL Server、MySQL、Oracle等主流数据库。

2.EF采用约定大于配置的框架原则,能遵守约定就不要去配置。

3.EF开发数据库的两种形式先建数据库或者先建模型。

4.EF三种开发模式:

◆ DataBase First (数据库优先)

 如果数据库已存在,可以使用VS自动生成数据模型以及相关的edmx文件。

 使用简单、方便,适用于数据库会频繁修改来满足新的需求。

◆ Model First (模型优先)

 如果数据库未创建,可以在VS中利用Model设计数据库,通过设计器生成映射信息(edmx文件),并生成数据库。开发中很少使用。

◆ Code First (代码优先)

 可以通过设计的数据模型自动生成数据库,也可以通过已存在的数据库生成数据模型,进行数据库映射,都没有edmx文件。

EF三种开发模式使用比较:

ORM框架:Entity Framework第1张

 3. Entity Framework的组成

下图很好地说明了EF的基本组成:

 ORM框架:Entity Framework第2张

EF的组成简单总结如下:

1、EDM(实体数据模型):EDM包含三个主要部分——概念模型,映射和存储模型。

概念模型(entity):概念模型包含了模型类和它们之间的关系。 这将是独立于数据库表设计。

存储模型(data):存储模型是数据库设计模型,包括表、视图、存储过程、以及它们之间的关系。

映射(mapping):映射由概念模型如何映射到存储模型的信息组成。

2、LINQ To Entity: LINQ To Entity是一种的查询实体对象的语言, 它返回在概念模型中定义的实体。

3、Entity SQL:Entity SQL是一个类似于LINQ To Entity的查询语言。 然而,它比L2E更加复杂。

4、Object Services(对象服务):对象服务是访问数据库中的数据并返回数据的主要入口点。它负责数据实例化,把Entity Client Data Provider(下一层)的数据转换成实体对象。

5、Entity Client Data Provider:主要职责是将LINQ To Entity或Entity Sql转换成数据库可以识别的Sql查询语句,它通过ADO.Net Data Provider向数据库发送或者索取数据。

6、ADO.Net Data Provider:使用标准的Ado.net与数据库通信。

 ORM框架:Entity Framework第3张

4.Demo演示

1.Sqlserver创建测试用表

create table userinfo
(
userid varchar(50) PRIMARY key,  
username varchar(50) ,
password varchar(50) ,
phone varchar(50)
);
select * from userinfo;
--drop table userinfo;

2.新建Winform项目

 ORM框架:Entity Framework第4张

项目中添加EF引用

Install-Package EntityFramework -Version 5.0.0

 ORM框架:Entity Framework第5张

项目上新增Ado.net实体数据模型

 ORM框架:Entity Framework第6张

配置

 ORM框架:Entity Framework第7张

 ORM框架:Entity Framework第8张

 ORM框架:Entity Framework第9张

 ORM框架:Entity Framework第10张

 ORM框架:Entity Framework第11张

 ORM框架:Entity Framework第12张

 ORM框架:Entity Framework第13张

 ORM框架:Entity Framework第14张

 ORM框架:Entity Framework第15张

3.Demo演示代码

using System;
using System.Linq;
using System.Windows.Forms;

namespace EntityFrameworkDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        ////// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBox1.Text))
            {
                MessageBox.Show("用户名不能为空!");
                return;
            }
            using (var db = new developtestEntities())
            {
                userinfo user = new userinfo();
                user.userid = Guid.NewGuid().ToString();
                user.username = textBox1.Text;
                user.password = textBox2.Text;
                user.phone = textBox3.Text;
                db.Set<userinfo>().Add(user);
                int n = db.SaveChanges();
                textBox1.Text = "";
                textBox2.Text = "";
                textBox3.Text = "";
                MessageBox.Show("新增" + n + "个用户!");
            }
        }

        /// <summary>
        ////// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            int n = 0;
            var name = textBox1.Text;
            using (var db = new developtestEntities())
            {
                var users = db.Set<userinfo>().Where(x => x.username == name).ToList();
                foreach (var user in users)
                {
                    db.Set<userinfo>().Remove(user);
                    n += db.SaveChanges();
                }
            }
            textBox1.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
            MessageBox.Show("删除" + n + "个用户!");
        }

        /// <summary>
        ////// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            var name = textBox1.Text;
            using (var db = new developtestEntities())
            {
                var user = db.Set<userinfo>().FirstOrDefault(x => x.username == name);
                if (user != null)
                {
                    user.username = textBox1.Text;
                    user.password = textBox2.Text;
                    user.phone = textBox3.Text;
                }
                var n = db.SaveChanges();
                MessageBox.Show("修改" + n + "个用户!");
            }
        }

        /// <summary>
        ////// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            var name = textBox1.Text;
            using (var db = new developtestEntities())
            {
                var user = db.Set<userinfo>().FirstOrDefault(x => x.username == name);
                if (user != null)
                {
                    textBox1.Text = user.username;
                    textBox2.Text = user.password;
                    textBox3.Text = user.phone;
                }
                else
                    MessageBox.Show("用户不存在!");
            }
        }
    }
}

免责声明:文章转载自《ORM框架:Entity Framework》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇FPGA设计中的跨时钟域问题WPF: 实现带全选复选框的列表控件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux 安装oracle10g 配置dataguard 介绍和步骤

        DataGuard是甲骨文推出的一种高可用性数据库方案,在Oracle 8i之前被称为Standby Database。从Oracle 9i开始,正式更名为Data Guard。它是在主节点与备用节点间通过日志同步来保证数据的同步,可以实现数据库快速切换与灾难性恢复。Data Guard只是在软件上对数据库进行设置,并不需要额外购买任何组件...

软件开发阶段数据库升级维护策略

    软件开发阶段数据库升级维护策略 一 为什么要维护升级   1.1 现状和出现的问题 如果你开发一个的项目,没有用到数据库,那么你不用维护数据库。 如果你开发一个项目,用到数据库了,但是从不用修改,那么数据库的维护也相对的简单。 当你开发一个大的项目,数据库有很多表,视图,存储过程,数据库分成了几个,开发的团队很大,开发的周期很长,由于业务的需求数据...

Hibernate一级缓存、二级缓存

缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中,准确说就是一个数据结构中,这个数据结构通常是或类似HashMap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。 1、缓存的伪代码: DAO { HashMap map = new Ma...

springboot中使用h2数据库(内存模式)

使用H2的优点,不需要装有服务端和客户端,在项目中包含一个jar即可,加上初始化的SQL就可以使用数据库了 在springboot中引入,我的版本是2.1.4,里面就包含有h2的版本控制 <!-- 集成h2数据库 --> <dependency> <groupId>c...

C#使用SqlSugar操作数据库导致的问题:托管调试助手“FatalExecutionEngineError”:运行时遇到了 错误。此错误的地址为。。。。

使用SqlSugar操作数据一定要注意: 对象的属性类型和数据库的字段类型要保持一致 对象的属性类型和数据库的字段类型要保持一致 对象的属性类型和数据库的字段类型要保持一致 本人基础太差了,这个小问题我从下午2点一致排错了23:00,终于解决了。 1,SqlSugar操作数据的代码 public class TighteningResultServi...

NET Core3前后端分离开发框架

NET Core前后端分离快速开发框架 https://www.cnblogs.com/coldairarrow/p/11870993.html 引言 时间真快,转眼今年又要过去了。回想今年,依次开源发布了Colder.Fx.Net.AdminLTE(254Star)、Colder.Fx.Core.AdminLTE(335Star)、DotNettySoc...