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

连接数据库

然后我们开始链接数据库

  1. 我们在项目名称反键添加
  2. 点击新建项
  3. 点击数据
  4. 选择ADO.NET实体数据模型
  5. 名称修改成任意
  6. 选择来自数据库的EF设计器
  7. 新建连接
  8. 链接到刚创建的Student数据库
  9. 选择6.0版本
  10. 选中表
  11. 点击确认所生成对象名称的单复数形式

注意:

  • 第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事件开始敲代码

  1. 全局变量下生成一个上下文类StudentEntities db = new StudentEntities();
  2. 获取到文本框的值
  3. 生成实体类
  4. 利用上下文类,把数据缓存到EF
  5. 把数据存到数据库

注意:

  • 第一点处 这样写 可以方便我们每一个方法都可以使用他,避免了代码的重复

以下为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事件开始敲代码

  1. 查询linq(相当于数据库中的查询)
  2. 循环数据(相当于把数据存到table中 然后再全部给str)
  3. 输出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 += "&lt;table border='1'&gt;";
                str += "&lt;tr&gt;";
                str += "&lt;td&gt;" + item.StuID + "&lt;/td&gt;";
                str += "&lt;td&gt;" + item.StuName + "&lt;/td&gt;";
                str += "&lt;td&gt;" + item.StuSex + "&lt;/td&gt;";
                str += "&lt;td&gt;" + item.StuAge + "&lt;/td&gt;";1
                str += "&lt;td&gt;" + item.StuRemark + "&lt;/td&gt;";
                str += "&lt;/tr&gt;";
                str += "&lt;/table&gt;";
            }
            //输出str
            Response.Write(str);
        }

EF的删除

后台代码

进入btnDelete_Click敲写后台代码

  1. 获取ID
  2. 先查询,再删除
  3. 默认stuDel是多行数据 所以我们就要将他变成一行
  4. 删除
  5. 将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敲写后台代码

  1. 获取ID
  2. 生成实体类
  3. 根据状态删除

注意:

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&lt;StuInfo&gt;(stu).State = System.Data.Entity.EntityState.Deleted;
            db.SaveChanges();
            txtID.Text = "";

        }

EF的修改

后台代码

进入btnRevise_Click敲写后台代码

  1. 获取ID
  2. 先查询,再修改
  3. EF会默认你查询的是多条数据 所以我们要将他变为单条数据
  4. 修改

代码如下

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&lt;StuInfo&gt;(stuNew).State = System.Data.Entity.EntityState.Modified;
            db.SaveChanges();

        }

Q.E.D.