----EF多表连接完整版—学生用
上次学习了单表连接现在我们开始来学习一下多表连接
首先我们先要进行数据库的创建
首先让我们创建类库
create database TwoDown
use TwoDown
go
现在我们要进行创建表了
1.建一个 Article
2.建一个 Catelog
create table Article(
Id int primary key identity(1,1),
Title nvarchar(10) not null,
Anthor nvarchar(20) not null ,
Content text not null,
Typt int references Catelog(id) not null,
Date nvarchar(20) not null
)
create table Catelog(
id int primary key identity(1,1) not null,
TypeName nvarchar(20) not null
)
把两个表建成之后我们需要进行添加表信息
如图下是Article, Catelog的表信息
insert Article values
('钢铁是怎么炼成的','米尔托夫斯基','讲述怎么成就钢铁般的意志',1,'1990-10-6'),
('百年孤独','马尔克斯','一个家族百年兴衰',2,'1988-6-5'),
('生物进化论','达尔文','昆虫的种类',3,'1995-9-6'),
('从百草园到三味书屋','周树人','讲童年回忆',4,'1997-8-9'),
('唐诗三百首','未知','唐朝三百首诗歌',5,'1991-4-24')
insert Catelog values
('励志类'),
('历史类'),
('昆虫类'),
('叙述类'),
('诗词类')
当你把这些做完之后我们将要进行对项目的操作了
相信看到我上次发的就知道如何创作
现在我们在进行创作来加深我们的记忆
现在我们开始进行项目的创建
添加ASP.NET Web 应用程序点击下一步
然后变成这样:
然后我们需要创建类库了
我们要创建三个类库分别是:
1.视图层 Moels
2.数据访问层 DAL
3.业务逻辑层 BLL
然后我们需要把他们分别引用如:
数据访问层引用视图层 DAL–——》Moels
业务逻辑层引用 视图层与数据访问层 BLL——》Moels、DAL
当然我们的引用程序也需要引用业务逻辑层与视图层
当所有的引用做完之后
我们要开始在视图层进行任务了
首先我们右键点击视图层
点击添加新建项
并选择数据在数据中找到ADO.NET实体数据模型
点击添加
他会弹出一个窗口选择来自数据库的EF的设计器并进行下一步
然后这里需要我们连接数据库的服务名了请连接你们的服务名
并选择你的SQL Server身份验证
并选择输入你要使用的数据库名称后点击下一步
就会出现如下图:
点击是我们进行下一步的操作
你下一步的时候还会有一个窗体、窗体不需要管直接点击下一步
然后需要把表里面的全打勾如下图:
点击完成出现这张图我们的第一步就完成了
现在我们需要进行第二步:
首先我们要找到视图层里面的App.Config 然后点击进入到里面
我们需要拿到我们的数据库连接语句:
如图、码源:
<connectionStrings>
<add name="TwoDownEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=DESKTOP-DFAA3LD;initial catalog=TwoDown;user id=老许;password=bugaosuni.;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
当我们拿到这段代码之后我们需要打开我们的ASP.NET Web
点击Web.config把刚刚我们剪辑的码源放入我们的Web.config里面
如图:
当你这些都做完了我们将要开始第三步了
我们需要在点开视图层找到EntityFramework
然后点击他找到 “从对象浏览器中查看”
然后你会看到这几张图:
下面有一行是你的EntityFramework的位置信息我们需要复制
等下我们就会用到他了
因为视图层有这个引用所有我们数据访问层与Web窗体这边这需要
所有我们需要这个引用不然后面运行就不会出来
因为我创建了多次所有我的EF比较多你们一般就只有两个
一个EntityFramework、EntityFramework.sqlserver
如下图:
当你这些都完成之后我们就需要进行编写码源了
首先我们需要对数据访问层进行编写 DAL
当你生成一个类库的时候都会有一个Class类
所有我们需要将他进行改名
如:数据库表名 + DAO(ArticleDAO)
我们需要在这里面编写我们的增删改查的代码
但是我们需要调用视图层的这个
如码源、图片:
using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DAL
{
public class ArticleDAO
{
TwoDownEntities twoDown = new TwoDownEntities();
}
}
现在我们开始编写我们查询的码源了
如下:
public List<Article> Select()
{
//第一种方式
/*var reslut = (from u in twoDown.Article
select u).ToList();
return reslut;*/
//第二种方式
return twoDown.Article.Select(p => p).ToList();
}
现在我们需要在业务逻辑层里调用数据访问层里面的数据
如下就是查询的码源:
using DAL;
using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BLL
{
public class ArticleSerivce
{
ArticleDAO Article = new ArticleDAO();
public List<Article> Select()
{
return Article.Select();
}
}
}
当你了解查询的码源现在我们要开始对增删改的所有码源进行编写
现在如下码源就是所有ArticleDAO的:
using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DAL
{
public class ArticleDAO
{
TwoDownEntities twoDown = new TwoDownEntities();
/// <summary>
/// 查询所有的表信息
/// </summary>
/// <returns></returns>
public List<Article> Select()
{
//第一种方式
/*var reslut = (from u in twoDown.Article
select u).ToList();
return reslut;*/
//第二种方式
return twoDown.Article.Select(p => p).ToList();
}
/// <summary>
/// 根据ID查询表信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Article Select(int id)
{
var reslut = (from u in twoDown.Article
where u.Typt == id
select u).Single();
return reslut;
}
/// <summary>
/// 添加文章
/// </summary>
/// <param name="article"></param>
/// <returns></returns>
public int Add(Article article)
{
twoDown.Article.Add(article);
int count = twoDown.SaveChanges();
return count;
}
/// <summary>
/// 根据ID删除指定用户的信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public int DeleteIdBy(int id)
{
var reslut = (from u in twoDown.Article
where u.Id == id
select u).FirstOrDefault();
twoDown.Article.Remove(reslut);
return twoDown.SaveChanges();
}
/// <summary>
/// 删除
/// </summary>
/// <param name="article"></param>
/// <returns></returns>
public int Delete(Article article)
{
twoDown.Article.Remove(article);
int count = twoDown.SaveChanges();
return count;
}
public int Update(Article article)
{
twoDown.Entry<Article>(article).State = System.Data.Entity.EntityState.Modified;
int count = twoDown.SaveChanges();
return count;
}
}
}
好了当你把这个敲完之后我们现在要在ArticleSerivce里面对
ArticleDAO进行调用
如下码源:
using DAL;
using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BLL
{
public class ArticleSerivce
{
ArticleDAO Article = new ArticleDAO();
/// <summary>
/// 查询所有表信息
/// </summary>
/// <returns></returns>
public List<Article> Select()
{
return Article.Select();
}
/// <summary>
/// 根据id查询信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Article Select(int id)
{
return Article.Select(id);
}
/// <summary>
/// 添加文章
/// </summary>
/// <param name="article"></param>
/// <returns></returns>
public int AddArticle(Article article)
{
return Article.Add(article);
}
/// <summary>
/// 根据id来删除
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public int DeleteIdBy(int id)
{
return Article.DeleteIdBy(id);
}
/// <summary>
/// 删除
/// </summary>
/// <param name="article"></param>
/// <returns></returns>
public int Delete(Article article)
{
return Article.Delete(article);
}
/// <summary>
/// 修改
/// </summary>
/// <param name="article"></param>
/// <returns></returns>
public int Update(Article article)
{
return Article.Update(article);
}
}
}
当你把 “Article” 业务逻辑层与数据访问层写完后我们还需要写
第二个表的数据访问层与业务逻辑层
现在我们要开始对"Catelog"进行编写了
第一步我们需要在DAL里面在加一个Class类
和上一步命名一样:
表名 + DAO
现在我么要在 Catelog DAO 里面写入查询的代码了
如下:
using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DAL
{
public class CatelogDAO
{
private TwoDownEntities TD = new TwoDownEntities();
public List<Catelog> Select()
{
var reslut = from c in TD.Catelog
select c;
return reslut.ToList();
}
}
}
当我们在数据访问层里面写完之后
我们要在业务逻辑层里面加上一个Class类
和上一步命名一样:
表名 + Serivce
现在我么要在 Catelog Serivce里面写入查询的代码了
如下图、码源:
using DAL;
using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BLL
{
public class CatelogSerivce
{
CatelogDAO Catelog = new CatelogDAO();
public List<Catelog> Select()
{
return Catelog.Select();
}
}
}
好了当我们这些都写完之后我们要开始为运行做准备了
现在我们现在要开始对Web窗体进行编写
第一步在如下图点击右键添加创建新建项 点击Web窗体如图
点击添加;
就变成这样了:
现在我们需要在这里对他进行编写
我们的左边有一个工具箱点击工具箱找到一个 “GridView”
双击它就会变成这样
如图、设计图:
现在我们要把鼠标移到表上面可以看到右上角有一个三角形
我们要点击三角形可以看到他出来了 “GridView” 任务
我们选择数据源点击三角就可以看到
如图:
我们现在要选择对象然后点击确定
在选择业务对象
当你在数据对象没用看到BLL.ArticleSerivce 或者 BLL.CatelogSerivce
时我们需要重新生成解决方案并且把我们的Web窗体设置为启动项
和启动页面如下图:
再到设计图层哪里点击数据源
就可以看到你想要的东西了
如图:
现在我们需要配置了
请跟着我的步骤来
如果你已经到了上述那一步
需要点击下一步找到你在BLL里面写的查询表所有数据的码源
点击完成就可以了
如图、如码源:
这是BLL.ArticleSerivce里面的
你要找的这个别找错了
public List<Article> Select()
{
return Article.Select();
}
当你找到之后我们的查询“Article”表所有就完成了
现在我们要进行添加了
现在我们需要进入Web窗体
在我们码源里 “div” 下面添加一个“HyperLink”
如图:
我们现在要进行在创建一个Web窗体
这个窗体是为我们进行添加的
所以我们可以为这个表命名为:Add
如图:
当我们创建好这个窗体后
我们需要再回到第一个窗体里面
对我们刚刚添加 “HyperLink” 里面写入“NavigateUrl”
让我们可以点击就能去第二个表
如图、代码:
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Add.aspx">添加信息</asp:HyperLink>
因为我们没有在第二个Web里面写东西
所以我们需要在第二个Web窗体里面写代码
我们可以看看设计里面如图是
如代码:
<b>添加文章</b>
<div class="row">
<div class="cols-4">
标题:
</div>
<div class="cols-8">
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</div>
</div>
<div class="row">
<div class="cols-4">
作者:
</div>
<div class="cols-8">
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
</div>
</div>
<div class="row">
<div class="cols-4">
内容:
</div>
<div class="cols-8">
<asp:TextBox ID="TextBox3" runat="server" TextMode="MultiLine"></asp:TextBox>
</div>
</div>
<div class="row">
<div class="cols-4">
类型:
</div>
<div class="cols-8">
<asp:DropDownList ID="DropDownList1" runat="server" DataTextField="TypeName" DataValueField="Id"></asp:DropDownList>
</div>
</div>
<div class="row">
<div class="cols-4">
时间:
</div>
<div class="cols-8">
<asp:TextBox ID="TextBox5" runat="server"></asp:TextBox>
</div>
</div>
<div class="row">
<div class="cols-4">
</div>
<div class="cols-8">
<asp:Button ID="Button1" runat="server" Text="发表文章" OnClick="Button1_Click" />
</div>
</div>
现在我们需要在Add的Web窗体的Add.aspx.cs里面写代码
现在我们没用写代码的时候是这样的
如图;
现在我们要在
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
}
分别写入我们需要的代码
现在我们在第一个里面写
如下:
public partial class Add : System.Web.UI.Page
{
ArticleSerivce article = new ArticleSerivce();
CatelogSerivce catelog = new CatelogSerivce();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.DropDownList1.DataSource = catelog.Select();
this.DropDownList1.DataBind();
}
}
现在我们把第一个完成后
继续完成第二个
如下代码:
protected void Button1_Click(object sender, EventArgs e)
{
Article article = new Article();
article.Title = this.TextBox1.Text;
article.Anthor = this.TextBox2.Text;
article.Content = this.TextBox3.Text;
article.Dates = this.TextBox5.Text;
article1.Typt = int.Parse(this.DropDownList1.Text);
int count = TwoSerivce.AddArticle(article);
if (count>0)
{
Response.Write("<script>alert('添加信息成功');window.location.href='Defalut.aspx';</script>");
}
}
现在我们的添加就已经完成现在我们需要做到是删除
删除是在第一个Web窗体里面完成的
所以我们要回到第一个Web窗体
然后我们需要点击设计
在设计里面把鼠标移到表格上
我们在表格的三角里面找的编辑列
点击编辑列在编辑列里面找到 “CommandField”
在这里面找到删除我们点击添加就可以了
如图:
现在我需要回到我们的码源里来
在ObjectDataSource 里面写 DeleteMethod
后我们还需要 创建一个DeleteParameters
在里面写<asp:Parameter Name=“id” Type=“Int32”/>
现在如图、码源:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="Select" TypeName="BLL.ArticleSerivce" DeleteMethod="id">
<DeleteParameters>
<asp:Parameter Name="id" Type="Int32"/>
</DeleteParameters>
</asp:ObjectDataSource>
当我们把这些做完之后我们就需要在第一个Web窗体里面写
如下:
protected void Page_Load(object sender, EventArgs e)
{
//删除
}
现在我们需要在上面的代码里面加入删除的码源了
注:这是正在第一个窗体的cs里面写的
如下码源:
protected void Page_Load(object sender, EventArgs e)
{
//删除
string masg = Request.QueryString["msag"];
if (!string.IsNullOrEmpty(masg))
Response.Write("<script>alert(" + masg + ")</script>");
}
如果你发现这种错误
那么你就有一个东西没有写所以他删除不了
怎么解决呢
我们需要在第一个表里面添加“DataKeyNames=“Id””
解决如下:
如下图、
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="ObjectDataSource1" DataKeyNames="Id">
好了这样我们的删除就完成了
现在我们需要做一个更改
现在我们的更改还是需要在第一个Web窗体里面进行
我们要在打开第一个窗体的设计
然后我们需要在点击表的三角
然后点击编辑列
同理“ 删除 ”
我们需要在 ObjectDataSource 加一个代码 UpdateMethod=“Uptate”
我们还需要在DeleteParameters 写 UpdateParameters
代码如下:
如图:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="Select" TypeName="BLL.ArticleSerivce" DeleteMethod="DeleteById" UpdateMethod="Update">
<DeleteParameters>
<asp:Parameter Name="id" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="Id" Type="Int32" />
<asp:Parameter Name="Title" Type="String" />
<asp:Parameter Name="Anthor" Type="String" />
<asp:Parameter Name="Content" Type="String" />
<asp:Parameter Name="Typt" Type="DateTime" />
<asp:Parameter Name="Sun" Type="String" />
</UpdateParameters>
</asp:ObjectDataSource>
现在我们还是需要在“ArticleSerivce”编写一行对编辑有用的代码
如下代码:
/// <summary>
/// 编辑
/// </summary>
/// <param name="article"></param>
/// <returns></returns>
public int Update(int Id,string Title,string Anthor,string Content,int Typt,string Sun)
{
Article article = new Article();
article.Id = Id;
article.Title = Title;
article.Anthor = Anthor;
article.Content = Content;
article.Typt = Typt;
article.Sun = Sun;
return Articles.Update(article);
}
现在这个EF多表连接就完成了
你学会了吗?
加油吧少年!!!