Entity Framework4.0 (九EF4與WCF Data Service的結合使用


前面我們講述了EF4的數據綁定。知道EF4的容器可以作為數據源控件的數據源。以前我們作數據綁定是指向Dataset,使用DataAdapter與數據庫連接,然后fill到dataset中。當我們使用EF4的數據綁定時,我們的數據源控件不再依靠DataAdapter直接與數據庫交互,而是依靠EF4容器,然后再由EF4與數據庫交互。

這一次我們講述:EF4與WCF Data Servicer的結合使用:EF4容器作為Data Service的數據提供者。

如果你對WCF Data Service不了解,沒關系。這和Web Service很相像。如果你對Web Service也不了解,也沒關系。咱們先把程序跑起來,你看看有多簡單就知道是咋回事了。(其實,好多人剛開始接觸新事物的時候,一股腦兒找到的資料全是定義。任何一個物事都不是語言文字可以准備定義的。就算定義准確了,能保證讀者也能理解准確嗎?所以,最簡單的方式就是演示出來,讓大家看看。就OK了。如果想深入研究,也至少知道努力的方向了。這就是所謂的:"先主桿,后枝葉"的學習過程)呵呵。

好了,不再廢話了,大家肯定都煩俺絮叨了。呵呵,

==================================================================

1.啟動Visual Studio2010 :File-->new Project-->ASP.NET Web Application. 項目名稱:EFWCFDemo。

2.刪除項目中使用不到的文件夾和文件(防止它們在這里混淆視聽):如下圖:

3.在項目EFWCFDemo上面右鍵—》Add-->New Item .選擇ADO.NET Entity Data Modell 名稱:Northwind.如下圖:

4.在項目EFWCFDemo上面右鍵—》AddàNew Item. 選擇 WCF Data Service:名稱:EFWCFService。如下圖:

 

5. 添加完以后,會默認打開EFWCFService.svc.cs文件。如果沒有打開,你可以雙擊EFWCFService.svc即可打開EFWCFService.svc.cs文件。有如下代碼:

 1  public class EFWCFService : DataService< /* TODO: put your data source class name here */ >
2 {
3 // This method is called only once to initialize service-wide policies.
4 public static void InitializeService(DataServiceConfiguration config)
5 {
6 // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
7 // Examples:
8 // config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);
9 // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
10
11
12 config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
13 }
14 }

更改成下面的代碼:(我們就是指定了類EFWCFService的父類的泛型類型為NorthwindEntities。

NorthwindEntities其實就是EF4的容器類了,所以把容器當作泛型參數的實參傳進去,Data Service就到該容器中取數據了。為了方便起見,我們把*.edmx和EFWCFService.svc文件放在了同一個項目的同一個namespace下面。你也可以根據實際需要把它們分開。使用的時候,再把相應的namespace添加進去就行了。)

同時我們也在代碼中添加了一行:  config.SetEntitySetAccessRule("*",EntitySetRights.All); 這是配置對EF4容器中的EntitySet的訪問權限。第一個參數:“*”代表全部。因為我們只有一個實體集CategorySet。所以一會在瀏覽器中我們只會看到一個Categories。第二個參數:EntitySetRights.All指擁有全部的權限。EntitySetRights枚舉值比較簡單:見名知意,所以不多講了。

EFWCFService
 1  public class EFWCFService : DataService< NorthwindEntities >
2 {
3 // This method is called only once to initialize service-wide policies.
4 public static void InitializeService(DataServiceConfiguration config)
5 {
6 // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
7 // Examples:
8 // config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);
9 // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
10
11 config.SetEntitySetAccessRule("*",EntitySetRights.All);
12 config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
13 }
14 }

瀏覽器顯示如下:

1   <?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
2 - <service xml:base="http://localhost:1713/EFWCFService.svc/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app">
3 - <workspace>
4 <atom:title>Default</atom:title>
5 - <collection href="Categories">
6 <atom:title>Categories</atom:title>
7 </collection>
8 </workspace>
9 </service>

說明:第5行:href 的值為當前實體集相對於WCF Data Service項目的URi:即在http://localhost:1713/EFWCFService.svc/的后面再追加:Categories就是當前實體集的URi,你可以試下:如果有類似於“您正在查看的源包含頻繁更新的內容。訂閱源后,該源會添加到“常見源列表”中。該源的更新信息會自動下載到計算機,通過 Internet Explorer 及其他程序可以查看這些信息”的提示。你可以在瀏覽器上:工具-》internet選項-如下圖:

然后,你再訪問CategorySet的URi就ok了。

6.在解決方案上面:右鍵-》Add -》New Item 選擇Windows Form Application。名稱:EFWCFTest。

在EFWCFTest項目下面的的References節點上右鍵,然后添加web service如下圖:

在窗體Form1上面添加兩個按鈕:一個Button(名稱:btnFill。顯示文本:Fill)和一個ListBox(名稱:lboxCategory)如下圖:

給btnFill添加Click事件:代碼如下:

View Code
 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using EFWCFTest.EFWCFReference;
10
11 namespace EFWCFTest
12 {
13 public partial class Form1 : Form
14 {
15 public Form1()
16 {
17 InitializeComponent();
18 }
19
20 private void btnFill_Click(object sender, EventArgs e)
21 {
22 NorthwindEntities svc = new NorthwindEntities(new Uri("http://localhost:1713/EFWCFService.svc/"));
23 foreach (Category c in svc.Categories)
24 {
25 this.lboxCategory.Items.Add(string.Format("{0}::{1}",c.CategoryID,c.CategoryName));
26 }
27 }
28 }
29 }

注意:

代碼第9行:添加了一個命名空間:該命名空間是由添加Web 引用的時候生成的,代表的是本地代理類的命名空間。我們是通過直接操作本地代理,然后由本地代理去查找、訪問wcf data service所公開的方法的。

代碼第22行,此時的NorthwindEntities已經不再是EF4中的NorthwindEntities了。因為我們在窗體項目中未引用EF4,我們只是添加了一個Web 引用,指向了WCF Data Service的URi。由WCF Data Service去EF4中找到數據。那代碼第22行,此時的NorthwindEntities來自哪呢?你可以在VS2010中定位到該類,然后發現:它只是一個本地代理類。並不是EF4中,由*.edmx所映射成的類。只是碰巧它們的名字默認是一樣的。(不要混淆了喲!!) 

設置EFWCFTest為啟動項目,然后運行程序。

點擊Fill按鈕。如下圖:

如果你想像以前使用EF4容器那樣使用LINQ 去查詢代理時,也可以用以下代碼實現:btnFill的click事件。(這里假設我們需要找到CategoryName以“B”開頭的實體)

 1  private void btnFill_Click(object sender, EventArgs e)
2 {
3 NorthwindEntities svc = new NorthwindEntities(new Uri("http://localhost:1713/EFWCFService.svc/"));
4
5 var categories = from c in svc.Categories
6 where c.CategoryName.StartsWith("B")
7 select new { c.CategoryID, c.CategoryName };
8
9 foreach (var c in categories)
10 {
11 this.lboxCategory.Items.Add(string.Format("{0}::{1}", c.CategoryID, c.CategoryName));
12 }
13
14 }

svc.Categories 的返回類型是:DataServiceQuery<T>,而LINQ表達式篩選后得到的接口是IQueryable<T>。DataServiceQuery<T>是實現了IQueryable<T>接口的。

 

怎么樣?是不是感覺世界又美好了許多。呵呵。

=============================
好了,就到這了。晚安 to you and to me ...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM