https://www.cnblogs.com/net064/p/8024150.html

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 = "405325966@qq.com",
Name = "张三",
Phone = "63339236",
T_Class = new T_Class() { ID = 1, Name = "一班" }
};

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

      /// <summary>
/// 向数据库插入一条学生信息
/// </summary>
public bool AddStudent()
{
//创建数据库访问网关
//SchoolDBEntities在配置文件中(App.config中)
using (SchoolDBEntities schoolEntities = new SchoolDBEntities())
{
//创建student一个实体
T_Student student = new T_Student()
{
ClassID = 1,
Email = "405325966@qq.com",
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 = "tengxun@126.com",
Name = "李四",
Phone = "139******"
};

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

}
}

 /// <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 = "tengxun@126.com",
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 = "360@126.com",
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;

}
}

 public bool EditStudent02()
{
//说明,编辑的时候需要给主键赋值
//修改所有的字段
//编辑
//创建数据库访问网关
//SchoolDBEntities在配置文件中
using (SchoolDBEntities schoolEntities = new SchoolDBEntities())
{ T_Student student = new T_Student
{
ID =1,//编辑ID=1的学生的信息
ClassID = 4,
Email = "360@126.com",
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;
}

}

 //查询获得一个实体
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;

}
}

     /// <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 = "guo123@126.com",

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

};
//创建student一个实体
T_Student student01 = new T_Student()
{
Email = "guo456@126.com",

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

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

}
}

      /// <summary>
/// 使用事务
/// </summary>
/// <returns></returns>
public bool UserTranAddStu()
{
//使用事务
//创建数据库访问网关
//SchoolDBEntities在配置文件中
using (SchoolDBEntities schoolEntities = new SchoolDBEntities())
{ //创建student一个实体
T_Student student = new T_Student() {
Email = "guo123@126.com", Name = "长城",
Phone = "1201",
ClassID=1 };
//创建student一个实体
T_Student student01 = new T_Student()
{
Email = "guo456@126.com", 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 = "guo123@126.com",

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

};
students.Add(student);
//创建student一个实体
T_Student student01 = new T_Student()
{
Email = "guo456@126.com",

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

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

}
}

 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 = "guo123@126.com", Name = "长城",
Phone = "1201",
ClassID = 1 };
students.Add(student);
//创建student一个实体
T_Student student01 = new T_Student()
{
Email = "guo456@126.com", 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
)

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;

}
}

EF database first的更多相关文章

  1. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(4)-构建项目解决方案 创建EF DataBase Frist模式

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(4)-构建项目解决方案 创建EF DataBase Frist模式 进行本次文章之前,我们可能需要补充一些 ...

  2. 用EF DataBase First做一个简单的MVC3报名页面

    使用EF DataBase First做一个简单的MVC3报名网站 ORM(Object Relational Mapping)是面向对象语言中的一种数据访问技术,在ASP.NET中,可以通过ADO. ...

  3. EF DataBase First生成model的验证

    如何避免在EF自动生成的model中的DataAnnotation被覆盖掉 相信很多人刚接触EF+MVC的时候,DataBase First模式生成model类中加验证信息的时候,会在重新生成mode ...

  4. EF - Database First 开发方式

    概述 Database First 又叫数据库优先的开发方式,是一种比较旧的开发方式,现在越来越多的企业已经不再使用此种开发方式. 当然,对于一些旧项目进行升级,在已经有了数据库的情况下,使用此种方式 ...

  5. Asp.net mvc + .net ef database first 或 model first 时如何添加验证特性

    今天有个同事问到,在使用Entity Framework 的Database frist或model first时,怎么在model上添加验证的特性? 因为此时的Model是是VS 工具怎么生成的,直 ...

  6. .Net C# EF database first connectionstring

    <connectionStrings> <add name="CupCreditCheckDB" connectionString="metadata= ...

  7. EF Database first 中,实现 多个表对应一个 实体的 查询

    1.首先 创建好 数据 库. hobby表 major 表 student 表 外键 关系如下 2. 实现将 数据库 映射到EDM中 视图如下 在VS中 生成了 3个实体类  ,对应的是 数据库中的3 ...

  8. Entity Framework(EF的Database First方法)

    EntityFramework,是Microsoft的一款ORM(Object-Relation-Mapping)框架.同其它ORM(如,NHibernate,Hibernate)一样, 一是为了使开 ...

  9. EF Core CodeFirst实践 ( 使用MS SqlServer)

    这里使用 MS SQLSERVER ,网上大多使用 SQLite 先来一个CodeFirst 新建项目 这里我们选择  ASP.NET Core Web Application (.NET Core) ...

随机推荐

  1. srpingboot web - 启动(3) 监听器

    接上一篇 一. getRunListeners() 在run() 方法中调用了 getRunListeners(args) 方法, 先看一下这个方法干了什么 private SpringApplica ...

  2. 2019牛客多校第二场H题(悬线法)

    把以前的题补补,用悬线求面积第二大的子矩形.我们先求出最大子矩阵的面积,并记录其行三个方向上的悬线长度.然后排除这个矩形,记得还得特判少一行或者少一列的情况 #include <bits/std ...

  3. 【Python】七段数码管绘制问题

    问题分析: 绘制路径: 代码: import turtle #引入绘图库turtle def drawLine(draw): #绘制单段数码管 turtle.pendown() if draw els ...

  4. JS首字母进行分类合并加排序

    let array = ['fds', 'ewfg1', 'cvd', 'ew', 'qer', 'jjh', 'rth', 'asd', 'vsd', 'tteh', 'fxv']; let map ...

  5. dubbo之心跳机制

    在网络传输中,怎么确保通道连接的可用性是一个很重要的问题,简单的说,在网络通信中有客户端和服务端,一个负责发送请求,一个负责接收请求,在保证连接有效性的背景下,这两个物体扮演了什么角色,心跳机制能有效 ...

  6. c# 调用c++类库控制usb继电器

    网上找不到调用此类库的文章,简单写一下,以备后用. 下面是封装后的调用c++类库的类 public class UsbRelayDeviceHelper { /// <summary> / ...

  7. react admin

    react admin 管理后台的快速创建方式

  8. 如何与GitHub同步,将本地文件push到到远程仓库

    Run git config --global user.email "you@example.com" git config --global user.name "Y ...

  9. [TJOI2013] 奖学金 - 堆

    按 a 排序,暴力用堆维护两侧预处理, 然后枚举中位数即可 #include <bits/stdc++.h> using namespace std; #define int long l ...

  10. SQL四种语言:DDL,DML,DCL,TCL 的区别

    1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...