ORM框架:Entity Framework

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三种开发模式使用比较:

 3. Entity Framework的组成

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

 

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与数据库通信。

 

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项目

 

项目中添加EF引用

Install-Package EntityFramework -Version 5.0.0

 

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

 

配置

 

 

 

 

 

 

 

 

 

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("用户不存在!");
            }
        }
    }
}

 

posted @ 2020-12-28 17:51  新*  阅读(375)  评论(0编辑  收藏  举报