用EF用了好長一段時間了,從EF4.0的版本開始接觸,感覺這個ORM不能說性能是最好的,但是我個人感覺功能實現以及和mvc的結合還是一個不錯的企業級網站的解決方案,在此寫個簡易的通用擴展方法來方便大家使用以及增刪改的時候方便調用,由於在此只做簡單演示和介紹,可能程序不會那么健壯,希望大家自己完善下或者給我消息一同解決。
一般code first的自己定義的實體類都會有相同的字段屬性名字,就從這入手,定義一個接口進行共同的屬性定義,通過實體類繼承接口來實現擴展方法的實現,首先定義一下接口,如下
public interface INETData { /// <summary> /// 數據ID主鍵 /// </summary> int ID { get; set; } /// <summary> /// 更新時間 /// </summary> DateTime? UpdateTime { get; set; } /// <summary> /// 創建時間 /// </summary> DateTime? CreateTime { get; set; } /// <summary> /// 狀態 /// </summary> int? State { get; set; } }
在做一個實體類來做演示,實體類繼承實現上面接口,如下:
public class Article:INETData { public int ID { get; set; } public string Title { get; set; } public string Content { get; set; } public int? State { get; set; } public DateTime? UpdateTime { get; set; } public DateTime? CreateTime { get; set; } }
用接口就是方便擴展,可能我定義的接口字段有點多,你可以根據自己的數據庫設計來自己定義,接下來就寫下數據的擴展方法,如下:
public static class DataExtension { private static GeneralNETEntities queryEntities = null; private static GeneralNETEntities db { get { if (queryEntities == null) { queryEntities = new GeneralNETEntities(); } return queryEntities; } } /// <summary> /// 添加或修改 /// </summary> /// <param name="data"></param> /// <returns></returns> public static bool SaveOrUpdate(this IData data) { bool success = false; if (data != null) { if (data.Id < 1) { if (!data.State.HasValue) { data.State = 0; } data.CreateTime = DateTime.Now; data.UpdateTime = DateTime.Now; db.Set(data.GetType()).Add(data); } else { data.UpdateTime = DateTime.Now; UpdateData(data); } try { db.SaveChanges(); success = true; } catch { success = false; } } return success; } /// <summary> /// 刪除操作 /// </summary> /// <param name="data"></param> /// <param name="isLogicDelete"></param> /// <returns></returns> private static bool Delete(this IData data, bool isLogicDelete) { bool success = false; try { if (isLogicDelete) { data.State = -1; // state = -1 時,邏輯刪除 UpdateData(data); } else { db.Set(data.GetType()).Attach(data); db.Set(data.GetType()).Remove(data); } db.SaveChanges(); success = true; } catch (Exception) { success = false; } return success; } /// <summary> /// 邏輯刪除state = -1 /// </summary> /// <param name="data"></param> /// <returns></returns> public static bool Delete(this IData data) { return Delete(data, true); } /// <summary> /// 徹底刪除 /// </summary> /// <param name="data"></param> /// <returns></returns> public static bool Remove(this IData data) { return Delete(data, false); } /// <summary> /// 更新操作 /// </summary> /// <param name="data"></param> /// <returns></returns> private static bool UpdateData(this IData data) { bool success = false; try { if (data != null) { db.Entry(data).State = System.Data.EntityState.Modified; success = true; } } catch (Exception) { success = false; } return success; } }
有了這個擴展方法就ok了,以上代碼加上實現EF的DbContext的那個類就可以做項目的數據層了,接下來看使用方法,在此我們在做一個中間層來做業務邏輯處理,簡單修改和保存調用方法 ,如下:
public bool SaveOrUpdate(Article model) { return model.SaveOrUpdate(); }
刪除的方法一樣,接下來在mvc的控制器里就可以調用業務邏輯層的方法了,首先new一個業務層的對象類,然后比方說你的控制器接到了view視圖傳過來的數據實體,然后就可以直接調用業務層的方法把參數傳就去就ok了,
這樣做的優點是方便調用,把保存和修改整合到一塊了,另外數據實體類比方說更新時間和創建時間的記錄啊都可以通過接口來耦合,而不用在單獨添加數據了,只要實現了那個接口就可以實現增刪改的擴展方法。
以上就是我做的簡單整合,希望大家多提意見,可能有點寫的有點啰嗦,主要是我希望方便基礎不好的同學能方便看懂,因為我也是從一個小白走過來的,可以想到當初我入門時自己的辛苦,我希望那些對技術比較感興趣的新手可以走的快一點。