Entity Framework(EF)(一)之database first

1、EF简介
ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案。
该框架曾经为.NET Framework的一部分,但version 6之后从.NET Framework分离出来。

EF是微软开发的一款ORM框架。ORM框架能够自动实现Entity实体的属性与关系型数据库字段的映射,增删改查的sql脚本由ORM来
自动生成,使我们编码时不用考虑数据库数据结构,而是以操作实体对象的形式来完成与数据库的交互。
与传统开发方式相比ORM可以使我们编写更少的代码来创建和维护应用程序。

ef开发模式有多种:code first、database first。
本文只是介绍database first,想要了解其他一些开发模式,请自行网上查找资料。

2、database first
“Database First”模式顾名思义:“数据库优先”,使用这种模式的前提是应用程序已经拥有相应的数据库,
咱们可以使用EF设计工具由数据库生成数据模型类。

3、操作准备
(1)、本示例的开发环境是vs2012\sqlservel 2012
           当然选择别的开发环境、数据库同样也是可以的。
(2)、创建数据库、数据表
            第一、打开sqlserver数据库,新建一个数据库(database)并命名为:SchoolDB
            第二、创建数据表:T_Class
                           USE SchoolDB
                             GO
                            CREATE TABLE T_Class(
                                     ID int primary key  IDENTITY(1,1) NOT NULL,
                                     Name nvarchar(max) NOT NULL
                                )
             第三、创建数据表:T_Student
                        USE SchoolDB
                        GO
                         CREATE TABLE T_Student(
                         ID int primary key identity(1,1) NOT NULL,
                         Name nvarchar(max) NOT NULL,
                        ClassID int NOT NULL,
                        Phone nvarchar(max) NOT NULL,
                        Email nvarchar(max) NOT NULL,
                        FOREIGN KEY(ClassID) REFERENCES T_Class (ID)
                          )
             第四、创建数据表:T_Teacher
                     USE [SchoolDB]
                     GO

CREATE TABLE T_Teacher(
                            ID int PRIMARY KEY IDENTITY(1,1) NOT NULL,
                            Name nvarchar(max) NOT NULL,
                            Address nvarchar(max) NOT NULL,
                           Phone nvarchar(max) NOT NULL,
                           Email nvarchar(max) NOT NULL,
                           ClassID int NOT NULL,
                            FOREIGN KEY(ClassID) REFERENCES T_Class(ID)
                        )

4、利用EF,根据database first 原则生成实体类的步骤
第一步、打开vs2012 ,新建一个控制台应用程序,并名为:EFDatabaseFirstTest
             这里不再赘述,不会的网上查一下资料
第二步:创建实体模型
            在第一步创建的项目名称上右击, 添加“新建项”→Ado.Net实体数据模型
             命名为:Model1.edmx

如下图所示:


第三步:与现有的数据库进行连接生成EF实体
在做这步之前,首先确定你是否已经有现有数据库
(1)、选择从数据库生成实体数据模型


(2)、新建连接到现有的数据库,


(3)、点击下一步,选择我们要生成实体对应的表、试图、存储过程等,


(4)、最后点击完成,则系统帮我们生成了数据库实体类以及EDMX的定义文件。
生成的文件目录如下图所示:


到现在我们前期的准备工作就结束了,接下来我们将使用EF帮我们生成的数据库网关来操作数据库了

5、数据的增删改查操作
(1)、插入数据

      /// <summary>
        /// 向数据库插入一条学生信息
        /// </summary>
      public  bool AddStudent()
        {
            //创建数据库访问网关
            //SchoolDBEntities在配置文件中(App.config中)
            using (SchoolDBEntities schoolEntities = new SchoolDBEntities())
            {
                //创建student一个实体
                T_Student student = new T_Student()
                {
                    ClassID = 1,
                    Email = "[email protected]",
                    Name = "张三",
                    Phone = "63339236",
                    T_Class = new T_Class() { ID = 1, Name = "一班" }
                };

                //将创建的实体,放入网关的数据实体的集合
                schoolEntities.T_Student.Add(student);
                //写回数据库
              int k1=  schoolEntities.SaveChanges();
              return k1 > 0;
            }
        }

(2)、编辑数据
方法一:每次都需要对所有字段进行修改,效率低
示例代码:

 /// <summary>
        /// eidt 编辑student信息
        /// </summary>
        /// <returns></returns>
      public bool EditStudent01()
      {
          //说明,编辑的时候需要给主键赋值
          //修改所有的字段
          //编辑
          //创建数据库访问网关
          //SchoolDBEntities在配置文件中
          using (SchoolDBEntities schoolEntities = new SchoolDBEntities())
          {

              T_Student student = new T_Student
              {
                  ID =1,//编辑ID=1的学生的信息
                  ClassID = 4,
                  Email = "[email protected]",
                  Name = "李四",
                  Phone = "139******"
              };

              //将实体附加到对象管理器中
              schoolEntities.T_Student.Attach(student);
              //把当前实体的状态改为Modified
              schoolEntities.Entry(student).State = EntityState.Modified;
             int k1= schoolEntities.SaveChanges();
             return k1 > 0;

          }
      }

方法二:编辑、修改部分字段(属性)
示例代码:只是编辑Phone、Email两个字段

 public bool EditStudent02()
      {
          //说明,编辑的时候需要给主键赋值
          //修改所有的字段
          //编辑
          //创建数据库访问网关
          //SchoolDBEntities在配置文件中
          using (SchoolDBEntities schoolEntities = new SchoolDBEntities())
          {

              T_Student student = new T_Student
              {
                  ID =1,//编辑ID=1的学生的信息
                  ClassID = 4,
                  Email = "[email protected]",
                  Name = "李留",
                  Phone = "158******"
              };

              //将实体附加到对象管理器中
              schoolEntities.T_Student.Attach(student);
              //获取到user的状态实体,可以修改其状态
              var setEntry = ((IObjectContextAdapter)schoolEntities).ObjectContext.ObjectStateManager.GetObjectStateEntry(student);
              //只修改实体的Name属性和Age属性
              //修改需要对主键赋值,注意:这里需要对所有字段赋值,没有赋值的字段会用NULL更新到数据库,当然数据库设计的时候字段允许为null才可以
              setEntry.SetModifiedProperty("Email");
              setEntry.SetModifiedProperty("Phone");

             int k1= schoolEntities.SaveChanges();
             return k1 > 0;

          }
      }

(3)、查询:查询通过LinQ查询
//查询到学生对应的班级的外键,注意是使用的linq to ef ,它是生成的命令树,然后是生成的sql

var cls = (from c in schoolEntities.T_Class
                           where c.ID == 1
                           select c).SingleOrDefault<T_Class>();

注意:只有调用了FirstOrDefault, First, Single, ToList, ToArray等函数才会执行对数据库的查询  
 
示例代码:

 //查询获得一个实体
   public T_Class GetClass()
   {
       using (SchoolDBEntities schoolEntities = new SchoolDBEntities())
       {
           T_Class classObj = (from c in schoolEntities.T_Class
                               where c.ID == 2
                               select c).SingleOrDefault<T_Class>();
           return classObj;
       }

   }

      /// <summary>
        /// 获取实体列表
        /// </summary>
        /// <returns></returns>
   public List<T_Class> GetClass02()
   {
       using (SchoolDBEntities schoolEntities = new SchoolDBEntities())
       {
           var classObj = (from c in schoolEntities.T_Class select c).ToList<T_Class>();
           return classObj;
       }

   }

(4)、删除数据
  //删除,删除只需要主键即可

     /// <summary>
        /// 删除有两种方法,都在示例代码中
        /// </summary>
        /// <returns></returns>
   public bool deleteStudent()
   {
       //创建数据库访问网关
       //SchoolDBEntities在配置文件中
       using (SchoolDBEntities schoolEntities = new SchoolDBEntities())
       {
           T_Student student = new T_Student()
           {
               ID = 1

           };
           //将实体附加到对象管理器中
           schoolEntities.T_Student.Attach(student);
           //方法一:
           //schoolEntities.T_Teacher.Remove(teacher);
           //方法二:把当前实体的状态改为删除
           schoolEntities.Entry(student).State = EntityState.Deleted;
       int k1=schoolEntities.SaveChanges();//不论是方法一还是方法二 这一句代码都是必须的
       return k1 > 0;

       }
   }  

(5)、使用事务
 EF对事务进行了封装:context的saveChange()是有事务性的。

示例代码:
说明:添加多条记录的时候,最后可以只执行一次   schoolEntities.SaveChanges();
示例代码:

      /// <summary>
        /// 使用事务
        /// </summary>
        /// <returns></returns>
   public bool UserTranAddStu()
   {
       //使用事务
       //创建数据库访问网关
       //SchoolDBEntities在配置文件中
       using (SchoolDBEntities schoolEntities = new SchoolDBEntities())
       {

           //创建student一个实体
           T_Student student = new T_Student() {
              Email = "[email protected]",

          Name = "长城",
        Phone = "1201",
         ClassID=1

           };
           //创建student一个实体
           T_Student student01 = new T_Student()
           {
               Email = "[email protected]",

               Name = "万里",
               Phone = "1202",
               ClassID = 2

           };
           //将创建的实体,放入网关的数据实体的集合
           schoolEntities.T_Student.Add(student);
           schoolEntities.T_Student.Add(student01);
           //写回数据库
        int k1= schoolEntities.SaveChanges();
        return k1 == 2;

       }
   }

上面的示例也可以写成:

 public bool UserTranAddStu02()
   {
       //使用事务
       //创建数据库访问网关
       //SchoolDBEntities在配置文件中
       using (SchoolDBEntities schoolEntities = new SchoolDBEntities())
       {

           List<T_Student> students = new List<T_Student>();
           //创建student一个实体
           T_Student student = new T_Student()
           {
               Email = "[email protected]",

               Name = "长城",
               Phone = "1201",
               ClassID = 1

           };
           students.Add(student);
           //创建student一个实体
           T_Student student01 = new T_Student()
           {
               Email = "[email protected]",

               Name = "万里",
               Phone = "1202",
               ClassID = 2

           };
           students.Add(student01);
           //将创建的实体,放入网关的数据实体的集合
           students.ForEach(x => { schoolEntities.T_Student.Add(x); });
              //写回数据库
           int k1 = schoolEntities.SaveChanges();
           return k1 == students.Count;

       }
   }

6、扩展
这里所说的扩展是指在现有的数据库中,新增数据表
(1)、新建数据表

use SchoolDB
go
create table T_Course
(
Id int primary key identity(1,1) not null,
Name nvarchar(50) null
)

处理办法
(1)、添加T_Course.cs实体类
方法:右击 解决方案中项目中的“Model1.edmx”文件 -->打开
在打开的Model1.edmx[关系图1]的空白处 右击 选择“从数据库更新模型”
选择新增的数据表,生成模型即可

如下图所示:


(2)、然后既可以按照上面所讲的方法insert、edit、delete、select 操作了。

   public bool AddCourse()
   {
       //创建数据库访问网关
       //SchoolDBEntities在配置文件中
   using(SchoolDBEntities context=new SchoolDBEntities())
   {
       //定义一个实体、、
       T_Course course = new T_Course() {  Name="领跑英语"};

       //添加到网关的实体数据集合
       context.T_Course.Add(course);
       //保存数据
       int k1 = context.SaveChanges();
       return k1 > 0;

   }
   }

时间: 2024-11-05 20:24:55

Entity Framework(EF)(一)之database first的相关文章

ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Framework Core 1.0 也已经发布了,可以适用于 .NET Core 1.0 及ASP.NET Core 1.0 . EF Core RC2 时,使用的Code First: http://www.cnblogs.com/linezero/p/EntityFrameworkCore.html E

ASP.NET MVC5.0+Entity Framework(EF)6.1系列教程

ASP.NET MVC5.0+Entity Framework(EF)6.1系列教程 从webform+ado.net开发模式转换到asp.net mvc+ef开发模式已经有一年多时间了.一直希望能够将自己开发中的一点微薄经验写下啦,现在列个目录,鼓励自己写下去. 1.1 Entity Framework(EF) ASP.NET MVC+Entity Framework(EF)技术介绍 ASP.NET MVC+Entity Framework(EF)项目搭建 3种Entity Framework

Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询

Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询 SQL 中,有SQL Server Profiler可以用来查询性能以及查看外部调用的SQL代码. 但是,EF 连接MYSQL 之后,部分代码没法查询EF生成的SQL 代码,如下代码: db.BaseDept.Remove(basedept)的时候, db.BaseDept打断点,查询到的是select 语句, Remove之后,就变成执行结果了,具体生成的DELETE 的SQL 代码无法查看.

Entity Framework(EF的Model First方法)

EntityFramework,是Microsoft的一款ORM(Object-Relation-Mapping)框架.同其它ORM(如,NHibernate,Hibernate)一样, 一是为了使开发人员以操作对象的方式去操作关系型数据表. 二是为了屏蔽底层不同厂商的数据库,开发人员面向ORM框架编写数据的CRUD(Create,Retrieve,Update,Delete)操作,再由ORM框架将这些操作翻译成不同数据库厂商的语言. 从EF 4.X开始支持三种构建方法:1. Database

[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例

本文我们来学习一下在Entity Framework中使用Context删除多对多关系的实体是如何来实现的.我们将以一个具体的控制台小实例来了解和学习整个实现Entity Framework 多对多关系的实体删除的操作过程. 你将学习到 怎样创建一个引用Entity Framework的项目: 怎样配置Entity Framework的数据库连接: 怎样去掉Entity Framework Code First 生成的表名的复数: 怎样通过EntityTypeConfiguartion配置实体的

Entity Framework应用:EntityFramework DataBase First模式

在这篇文章中讲解如何使用EF的DbFirst模式实现数据的增删改查 一.新建控制台应用程序,然后右键->添加新建项,选择数据里面的实体数据模型: 然后点击添加 二.选择来自数据库的EF设计器,并点击下一步 三.在实体数据模型向导界面选择要使用的数据连接,或者点击新建连接按钮创建新的连接,这里选择已有的连接,并点击下一步: 四.选择实体框架6.0,点击下一步: 五.选择要操作的表,并点击完成: 六.查看生成的项目结构 自动添加了EntityFramework的引用.同时会在项目的根目录下面生成一个

Entity Framework(EF) Code First将实体中的string属性映射成text类型的几种方式

1.通过ColumnType属性设置 [Column(TypeName="text")] public string Text { get; set; } 在进行以上属性设置时,请首先引入命名空间:System.ComponentModel.DataAnnotations.Schema 2.通过StringLength属性设置 [StringLength(4010)] public string Text { get; set; } 3.通过Fluent API配置设置  modelB

csharp: NHibernate and Entity Framework (EF) (object-relational mapper)

https://sourceforge.net/projects/nhibernate/files/NHibernate/ http://www.codeproject.com/Articles/21122/NHibernate-Made-Simple http://www.c-sharpcorner.com/uploadfile/dpatra/using-nhibernate/ http://www.codeproject.com/Articles/363040/An-Introduction

ASP.NET MVC 5 + EF 6 入门教程 (5) Model和Entity Framework

文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-ef-6-get-started-model.html 上一节:ASP.NET MVC 5 入门教程 (4) View和ViewBag 源码下载:点我下载 MVC中的Model是用来给View提供显示数据的对象. 这里我们首先创建一个Model对象. 在解决方案资源管理器中右键点击Models文件夹,选择添加->类.添加一个名为Employee.cs的Model类.Models文件夹