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表中的所有資訊。