zoukankan      html  css  js  c++  java
  • 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("用户不存在!");
                }
            }
        }
    }
    作者:九年新
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    PHP函数正则表达式函数
    PHP函数变量函数
    Passing Wpf Objects Between Threads (With Source Code)
    分手后,何必再要做朋友?
    享受爱,给予爱
    人生如戏
    深夜电话
    我们也要在不同的事情上面有不同的哲学的情况,才行
    幸 福
    你的平安夜是这样过的吗?
  • 原文地址:https://www.cnblogs.com/yellow3gold/p/14202795.html
Copyright © 2011-2022 走看看