WCF+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 SQL和LINQ to Entities 查詢將最終轉化為T-SQL的指令碼,從資料庫中查詢資料。與LINQ to SQL比較而言,ObjectContext
如果你想檢視所有執行的T-SQL語句你需要使用SQL Server的Profiler 工具.或者EntityCommand和ObjectQuery類都有一個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服務。以便客戶端能訂閱該服務並呼叫