1. 程式人生 > >WCF+Ef實戰系列二:EF實體的構建及資料業務層的處理

WCF+Ef實戰系列二:EF實體的構建及資料業務層的處理

        本文主要講述業務層和資料處理層的實現。由於我們使用了EF,則本身就實現了資料層的操作。因此我們首先要做的事就是構建EF模型。

第一步我們來建立相關的資料庫NewWide,裡面有一張表Employees,如下圖

列名

資料型別

可為空

長度

OID

Int

主鍵自動增長

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

UserCode

Nvarchar

10

UserName

Nvarchar

20

PWD

Nvarchar

40

IsAdmin

Bit

有關EF建模及其理論的部分,可以參考如下:

ADO.NET Entity Framework系列的5篇文章。在此我就不再廢話了。但是有一點基本常識就是在建模時表一定要有主鍵.

建立一個專案如Demo.EDM.同時新增一個新項Ado.NET Entity Data Model.

選擇從資料庫生成,

 

選擇你需要的結構,如表,Sp等。這裡由於是DEMO,因此只選擇Employees表。當然如果你以後在資料庫裡添加了新的物件,那你可以通驗證EDM來匯入新的物件。最終設計器顯示為

     已幫我們生成了我們所需要的模型了。你可以對些模型進行修改。當然是右鍵屬性設定了。如設為不可為空,或對映名等。這裡我不做修改了。

的文章已說的很詳細了。不理解的話可以再去看看。

在上圖我們可以看到生成的模型物件的名稱為Employees.這個是會讓人誤解的。因為我們一般實體物件是單數形式,而集合物件才以複式存在的。如員工應該是Employee,而員工集合才是Employees.因此只裡我們需要改動一下。

關於MyEDM.edmx這個還有個屬性值得注意的,就是元資料專案處理這塊,你可以選擇複製到輸出目錄。

Entity Data Model 是一個概念模型,所有Entity SQLLINQ to Entities 查詢將最終轉化為T-SQL的指令碼,從資料庫中查詢資料。與LINQ to SQL比較而言,ObjectContext

類沒有提供Log屬性或者通用的log機制,因此,無法在Visual Studio 中跟蹤所有的T-SQL語句。

如果你想檢視所有執行的T-SQL語句你需要使用SQL ServerProfiler 工具.或者EntityCommandObjectQuery類都有一個ToTraceString() 方法,第三種就是微軟也提供了一個免費的工具來幫助學習Entity SQL

eSqlBlast 的下載地址(含有原始碼,需要自己編譯一下)及其相關介紹(eSqlBlast for VS 2008 SP1):

而此工具在使用時需要獲取3個元資料檔案(CSDL/SSDL/MSL)。而剛才的選項可以生成此三個元資料檔案。

此專案中的app.config檔案裡包含了EF在執行時需要的連線字串,這個暫時不需要,但不要刪除。後面在執行時還是需要的。

到此為止,我們實現的資料訪問層的處理。是不是很簡單。下面我們來講一下業務層的處理。

當然我們這裡的業務很簡單,不存在一些邏輯的計算。只是呼叫資料訪問層來實現Employee物件的增刪改查。

再增加一個類庫Demo.BusinessManagers.同時新增Demo.EDM的引用。

程式碼如下:

using System;

using System.Collections.Generic;

using System.Data;

using System.Data.Objects;

using System.Data.Objects.DataClasses;

using System.Linq;

using System.Text;

using Demo.EDM;

using System.Data.EntityClient;

namespace Demo.BusinessManagers

{

public class EmployeeManager:IDisposable

{

newwideEntities context;

public EmployeeManager()

{

context = new newwideEntities();

}

public void Add(Employee emp)

{

context.AddToEmployees(emp);

context.SaveChanges();

}

public void Update(Employee emp)

{

context.Attach(emp); //不是新增。因此先附加

emp.SetAllModified(context); //由於此emp物件是客戶端上傳上來的。附加後,物件的狀態不存在更新標記。因此這裡設定其為更新狀態。如果不更改狀態,則不會生成相應的SQL

context.SaveChanges();

}

public void Delete(Employee emp)

{

//如果要刪除一個物件的話,先附加此物件,因為EF有個跟蹤機制存在。如果不這樣處理,則只能先select first delete 這樣會引起二次SQL語句

context.Attach(emp);

context.DeleteObject(emp);

context.SaveChanges();

}

public List<Employee> GetEmployees()

{

return context.Employees.ToList();

}

#region IDisposable 成員

public void Dispose()

{

context.Dispose();

}

#endregion

}

public static class EFExtension

{

//通知物件的屬性狀態改變

public static void SetAllModified<T>(this T entity, ObjectContext context) where T : IEntityWithKey

{

var stateEntry = context.ObjectStateManager.GetObjectStateEntry(entity.EntityKey);

var propertyNameList = stateEntry.CurrentValues.DataRecordInfo.FieldMetadata.Select(pn => pn.FieldType.Name);

foreach (var propName in propertyNameList)

{

stateEntry.SetModifiedProperty(propName);

}

}

}

}

好了。這樣我們就可以實現EMPLOYEE的基本處理了。下一次,我們將實現關於員工的WCF服務。以便客戶端能訂閱該服務並呼叫