EF+WCF框架搭建及简单应用
最近在搞一个底层数据库替换的项目,把之前的SQL server数据库替换成MySQL数据库,里面涉及到了许多的问题,其中最主要的问题就是数据库读取效率问题,在网上搜索“如何提高数据库读取效率”后发现,无非就是使用框架、优化sql语句等,这就不免让我想起了我老早之前学习的EF+ WCF框架,这个框架读取效率比较高,扩展性好,相较于最原始的sql语句来说优点很多,所以我最近花了点时间重新搭建了一个EF+WCF框架,并进行简单的应用。
下面我将详细介绍我的搭建过程和代码,只要按照我的流程来一定可以完成自己的EF+WCF框架,那么我们就开始吧。
vs版本:vs2015
EF实体框架:实体框架5.0
-
第一步 :创建解决方案
打开vs2015,并新建一个解决方案(EF+WCFSolution)。添加完成解决方案后,会在你右侧的解决方案资源管理器中生成你刚创建的解决方案。
-
第二步:创建应用程序的主入口
右键解决方案,点击添加,新建项目,弹出添加新项目功能界面,选择Windows窗体应用程序,名称为MainForm。点击确定。会在你右侧的解决方案资源管理器中生成你刚创建的Windows窗体应用程序。
-
第三步:搭建WCF
右键解决方案,点击添加,新建项目,弹出添加新项目功能界面,在右侧搜索框内输入WCF,然后选择WCF服务库,名称为WcfServiceLibrary。点击确定。会在你右侧的解决方案资源管理器中生成你刚创建的WCF服务库。
-
第四步:搭建EF
-
1:创建DataBase文件夹用于存放EF框架信息
右键解决方案,点击添加,点击新建解决方案文件夹,编辑文件夹名称为DataBase
-
2:添加底层数据操作类库
右键DataBase文件夹,点击添加,点击新建项目,弹出添加新项目功能界面,选择类库,名称为DataSource,点击确定,会在你右侧的解决方案资源管理器中生成你刚创建的底层数据库操作类库。
-
3:创建EF框架
右键你刚创建的DataSource类库,点击添加,点击新建项目,弹出添加新项目功能界面,选择ADO.NET实体数据模型,修改名称为EFModel,点击添加,弹出实体数据模型创建向导;
选择来自数据库的EF设计器,点击下一步;
按下图选择和输入对应的连接信息,点击测试链接,如果连接成功,点击确定即可,不过不成功,需要检查数据库服务和你选择填写的信息是否有误。
将App.config中的连接设置另存这个选择上,然后自定义你的数据库模型实体类名称,点击下一步。
注意这里要选择实体框架5.0,具体原因我在往期的文章(vs2015中搭建EF框架在代码生成策略中找不到“旧的ObjectContext”)中说过,可以看一下这里就知道是啥原因了。点击下一步。
选择你要生成模型的表,自定义模型的命名空间,点击完成,即可在解决方案资源管理器中生成对应的EF框架
-
4:修改EF框架为“旧的ObjectContext”模板下的EF框架
需要注意的是,上面步骤生成的EF框架是T4模板生成的EF框架,内部的模型代码没有自动生成,这就需要你手动写,但是手动写又存在出错的风险,所以我们这里需要修改生成EF框架的模板为“旧的ObjectContext”,具体步骤如下:
删除EF框架下生成的TT文件
双击EFMdel.edmx文件,右键左侧模型区域,选择属性,修改最上面的代码生成策略为“旧的ObjectContext”,然后重新生成此类库,可以发现EFModel.Designer.cs里面自动生成了模型代码。至此我们EF框架就创建好了,接下来我们需要编写数据处理的类和数据配置类
-
-
第五步:编写数据处理类
上面我们在DataSource中创建的EF框架,相当于就是创建了数据库对象,接下来我们就要对数据库进行增删改查操作。在database文件夹中创建DataProcessing类库(创建类库操作和上面的一致),并在类库中添加livestockInfoOprate.cs类,此类的作用就是对livestockInfo表进行增删改查。
编写livestockInfoOprate.cs文件,具体见下述代码
using DataSource;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DataProcessing
{
public class livestockInfoOprate
{
public List<livestockInfo> GetlivestockInfo()
{
using (livestockEntities entity = new livestockEntities())
{
return entity.livestockInfo.ToList();
}
}
}
}
- 第六步:编写数据配置类
编写完数据库操作类后,我们需要统一的配置类进行数据库配置,在database文件夹中创建DataAdapter类库(创建类库操作和上面的一致),并在类库中添加livestockInfo.cs类,此类的作用就是对livestockInfo表的功能进行外部配置显示,以方便调用。
编写livestockInfoOprate.cs文件,具体见下述代码
using DataProcessing;
using DataSource;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DataAdapter
{
public class livestockInfo
{
private livestockInfoOprate mTestOprate;
public livestockInfo()
{
mTestOprate = new livestockInfoOprate();
}
public List<DataSource.livestockInfo> GetlivestockInfo()
{
try
{
return mTestOprate.GetlivestockInfo();
}
catch(System.Exception ep) { return null; }
}
}
}
- 第七步:在WCF的服务接口中编写数据库读取接口
只需要在下图所示位置编写数据接口,如下图所示。
[OperationContract]
List<livestockInfo> GetlivestockInfo();
- 第八步:在Service1中实现数据读取接口
public List<DataSource.livestockInfo> GetlivestockInfo()
{
return mTest.GetlivestockInfo();
}
- 第九步:功能调用,测试EF+WCF框架是否能操作数据库
在系统启动项类库的MainForm窗体中进行设计,并实现livestockInfo表中数据的获取
Mainform后台代码:
using DataSource;
//using ServicesLib;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WcfServiceLibrary;
namespace MainForm
{
public partial class Form1 : Form
{
Service1 mService1 = new Service1();
//Services mServices = new Services();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Clear();
List<livestockInfo> mlist = mService1.GetlivestockInfo();
if(mlist != null && mlist.Count() > 0)
{
//dataGridView1.DataSource = mlist;
for (int i = 0; i < mlist.Count(); i++)
{
livestockInfo one = mlist[i];
DataGridViewRow row = new DataGridViewRow();
int index = dataGridView1.Rows.Add(row);
dataGridView1.Rows[index].Cells[0].Value = one.id;
dataGridView1.Rows[index].Cells[1].Value = one.sex;
dataGridView1.Rows[index].Cells[2].Value = one.ange;
dataGridView1.Rows[index].Cells[3].Value = one.length;
dataGridView1.Rows[index].Cells[4].Value = one.height;
dataGridView1.Rows[index].Cells[5].Value = one.weight;
dataGridView1.Rows[index].Cells[6].Value = one.birthdate;
if (one.deathdate != null && one.deathdate.ToString() != "")
dataGridView1.Rows[index].Cells[7].Value = one.deathdate;
if (one.status != null && one.status.ToString() != "")
dataGridView1.Rows[index].Cells[8].Value = one.status;
}
}
}
}
}
- 第十步:启动系统,进行测试
这个时候你会发现会报错,或者是没有获取到数据,跟代码你会发现报的错误是:“指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效。”,上网一查,是因为你配置信息中(App.config)缺少连接数据库的配置信息,需要注意的是你的启动项下的App.config也需要数据库连接的配置信息,这个时候你需要下述代码写到启动项下的App.config的指定位置处
<connectionStrings>
<add name="livestockEntities" connectionString="metadata=res://*/EFModel.csdl|res://*/EFModel.ssdl|res://*/EFModel.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=livestock;Persist Security Info=True;User ID=sa;Password=那数据库密码;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
</connectionStrings>
这时你再启动项目,会发现可以获取livestockInfo表中的所有信息。