EF的增加
数据库及项目的创建
首先我们得创建一个空的ASP.NET程序
然后我们建立数据库(代码如下显示)
use master
go
if exists(select * from sysdatabases where name='Student')
drop database Student
go
create database Student
go
use Student
go
--创建用户表
create table Users
(
UserID int primary key identity(101,1),
Account varchar(100),
pwd varchar(100),
Role varchar(100),
)
insert into Users(Account,pwd,Role) values('admin','admin123','超级管理员')
insert into Users(Account,pwd,Role) values('啊啊啊啊啊','啊啊啊啊啊','普通管理员')
insert into Users(Account,pwd,Role) values('123abc','123abc','超级管理员')
--创建学生信息表
create table StuInfo
(
StuID int primary key identity(1,1),
StuName varchar(50),
StuSex char(2),
StuAge varchar(50),
StuRemark varchar(200),
)
--添加数据
insert into StuInfo(StuName,StuSex,StuAge,StuRemark) values('刘德华','男','50','四大天王之一')
insert into StuInfo(StuName,StuSex,StuAge,StuRemark) values('张学友','男','55','歌神')
insert into StuInfo(StuName,StuSex,StuAge,StuRemark) values('黎明','男','48','很多歌迷')
insert into StuInfo(StuName,StuSex,StuAge,StuRemark) values('郭富城','男','52','跳舞')
insert into StuInfo(StuName,StuSex,StuAge,StuRemark) values('刘亦菲','女','30','神仙姐姐')
select StuID,StuName,StuSex,StuAge,StuRemark from StuInfo
select UserID,Account,pwd,Role from Users
--登录,用姓名和年龄来登录
select StuName,StuAge from StuInfo where StuName='黎明' or 1=1 and StuAge=48 or 1=1
--delete from StuInfo where StuID=2
连接数据库
然后我们开始链接数据库
- 我们在项目名称反键添加
- 点击新建项
- 点击数据
- 选择ADO.NET实体数据模型
- 名称修改成任意
- 选择来自数据库的EF设计器
- 新建连接
- 链接到刚创建的Student数据库
- 选择6.0版本
- 选中表
- 点击确认所生成对象名称的单复数形式
注意:
- 第5点处的名称 最好和数据库名称保持一致
- 第8点处 最好测试一下,防止没连上
- 第11点处的作用是在每张表后面+s,如果不勾选可能会存在系统的错误并且当我们前期确定使用EF模型时,数据库表一般是会自己加上s 如果建立数据库的时候加了s那么这里就可以不用勾选
创建页面
然后我们在项目中添加一个web窗体并修改样式 页面样式如下
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="EFTest.Index" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style>
td {
width:100px;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<table>
<tr>
<td>ID</td>
<td>
<asp:TextBox ID="txtID" runat="server" AutoCompleteType="Disabled"></asp:TextBox>
</td>
</tr>
<tr>
<td>姓名</td>
<td>
<asp:TextBox ID="txtName" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>性别</td>
<td>
<asp:TextBox ID="txtSex" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>年龄</td>
<td>
<asp:TextBox ID="txtAge" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>备注</td>
<td>
<asp:TextBox ID="txtRemark" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td colspan="2">
<asp:Button ID="btnAdd" runat="server" Text="添加" OnClick="btnAdd_Click" />
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
编写后台代码
写完后,进入btnAdd_Click事件开始敲代码
- 全局变量下生成一个上下文类StudentEntities db = new StudentEntities();
- 获取到文本框的值
- 生成实体类
- 利用上下文类,把数据缓存到EF
- 把数据存到数据库
注意:
- 第一点处 这样写 可以方便我们每一个方法都可以使用他,避免了代码的重复
以下为btnAdd_Click点击事件方法代码
protected void btnAdd_Click(object sender, EventArgs e)
{
//获取到文本框的值
string name = txtName.Text;
string age = txtAge.Text;
string sex = txtSex.Text;
string remark = txtRemark.Text;
//生成实体类
StuInfo stu = new StuInfo() {
StuName = name,
StuAge = age,
StuSex = sex,
StuRemark = remark
};
//利用上下文类,把数据缓存到EF
db.StuInfoes.Add(stu);
//把数据存到数据库
db.SaveChanges();
}
EF的查询
页面的修改
首先在btnAdd后面添加
查询 修改 删除 根据ID/状态删除 等button(代码如下)
<asp:Button ID="btnQuery" runat="server" Text="查询" OnClick="btnQuery_Click" />
<asp:Button ID="btnRevise" runat="server" Text="修改" OnClick="btnRevise_Click" />
<asp:Button ID="btnDelete" runat="server" Text="删除" OnClick="btnDelete_Click" />
<asp:Button ID="btnDeleteByID" runat="server" Text="根据ID/状态删除" OnClick="btnDeleteByID_Click" />
查询后台代码
进入btnQuery_Click事件开始敲代码
- 查询linq(相当于数据库中的查询)
- 循环数据(相当于把数据存到table中 然后再全部给str)
- 输出str
以下为btnQuery点击事件方法代码
protected void btnQuery_Click(object sender, EventArgs e)
{
//查询linq
var stu = from s in db.StuInfoes
select s;
//循环数据
string str = "";
foreach (var item in stu)
{
str += "<table border='1'>";
str += "<tr>";
str += "<td>" + item.StuID + "</td>";
str += "<td>" + item.StuName + "</td>";
str += "<td>" + item.StuSex + "</td>";
str += "<td>" + item.StuAge + "</td>";1
str += "<td>" + item.StuRemark + "</td>";
str += "</tr>";
str += "</table>";
}
//输出str
Response.Write(str);
}
EF的删除
后台代码
进入btnDelete_Click敲写后台代码
- 获取ID
- 先查询,再删除
- 默认stuDel是多行数据 所以我们就要将他变成一行
- 删除
- 将txtID的文本清空
代码如下所示
protected void btnDelete_Click(object sender, EventArgs e)
{
//获取ID
int id = Convert.ToInt32(txtID.Text);
//先查询,再删除
var stuDel = from s in db.StuInfoes
where s.StuID == id
select s;
//默认stuDel是多行数据 所以我们就要将他变成一行
var stuNew = stuDel.FirstOrDefault();
//删除
db.StuInfoes.Remove(stuNew);
db.SaveChanges();
txtID.Text ="";
}
EF的根据ID/状态删除
后台代码
进入btnDeleteByID_Click敲写后台代码
- 获取ID
- 生成实体类
- 根据状态删除
注意:
db.Entry<StuInfo>(stu)中stu 代表的是实体类 而StuInfo代表的是实体类的泛型
代码如下
protected void btnDeleteByID_Click(object sender, EventArgs e)
{
//获取ID
int id = Convert.ToInt32(txtID.Text);
//生成实体类
StuInfo stu = new StuInfo() {
StuID = id
};
//根据状态删除
db.Entry<StuInfo>(stu).State = System.Data.Entity.EntityState.Deleted;
db.SaveChanges();
txtID.Text = "";
}
EF的修改
后台代码
进入btnRevise_Click敲写后台代码
- 获取ID
- 先查询,再修改
- EF会默认你查询的是多条数据 所以我们要将他变为单条数据
- 修改
代码如下
protected void btnRevise_Click(object sender, EventArgs e)
{
//获取ID
int id = Convert.ToInt32(txtID.Text);
//先查询,再修改
var stu = from s in db.StuInfoes
where s.StuID == id
select s;
StuInfo sss = new StuInfo() {
StuName = "",
StuAge = "",
StuSex = "",
StuRemark = ""
};
//EF会默认你查询的是多条数据 所以我们要将他变为单条数据
var stuNew = stu.FirstOrDefault();
stuNew.StuName = "abc";
stuNew.StuAge = "99";
//修改
db.Entry<StuInfo>(stuNew).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
}
Q.E.D.