在上一篇文章中,咱們已經搭建了整個芒果後臺管理系統整個工程架構,並集成了AutoMapper,日誌組件等,接下來咱們將使用Entity Framework完善系統的持久化存儲部分。這篇EF的構造,我將以一種快速集成的方式實現,並提供超多的Linq公共方法供業務使用。sql
在XiaoMo.Repository工程裏,右鍵工程使用Nuget引入EntityFramework ,這裏我使用最新的6.4版本數據庫
在XiaoMo.Service的Web.config裏,添加Sql Server鏈接字符串(AppSetting內)架構
<add key="conStr" value="Server=10.60.215.202;Database=mango_sys;Persist Security Info=True;User ID=sa;Password=**" />
建立表app
對應Entity框架
[Table("Orders")] public class OrderInfoEntity { public int Id { get; set; } public DateTime OptTime { get; set; } public string Address { get; set; } public string Uuid { get; set; } public string AcceptUser { get; set; } public string TelephoneNumber { get; set; } public string ProductName { get; set; } public int Number { get; set; } public double Price { get; set; } public double Sum { get; set; } public string PackCompany { get; set; } public string PackNumber { get; set; } public string Status { get; set; } public string ExpressNumber { get; set; } }
建立數據庫交互上下文DatabaseContext.cs,初始化時指定鏈接。這裏由於咱們先用數據庫表,因此咱們使用Database.SetInitializer
public class DatebaseContext : DbContext { static string ConnectionString = ""; static DatebaseContext() { Database.SetInitializer<DatebaseContext>(null); } public DatebaseContext(string connStr) : base(connStr) { } public DatebaseContext() : base(GetConnectionString()) { } private static string GetConnectionString() { if (string.IsNullOrEmpty(ConnectionString)) { ConnectionString = ConfigurationManager.AppSettings["conStr"].ToString(); } return ConnectionString; } public virtual DbSet<OrderInfoEntity> Records { get; set; } public virtual DbSet<UsersEntity> User { get; set; } }
添加數據交互接口,這裏只列出幾個關鍵接口方法ui
public interface IRepository{} public interface IRepository<TEntity> : IRepository where TEntity : class
//methods代理
T Query<T>(Func<IQueryable<TEntity>, T> queryMethod); TEntity FirstOrDefault(Expression<Func<TEntity, bool>> predicate); TEntity Load<TPrimaryKey>(TPrimaryKey id); bool Exist(Expression<Func<TEntity, bool>> predicte); TEntity Insert(TEntity entity); TEntity Update(TEntity entity);
建立RepositoryManager.cs,封裝DatabaseContext,並實現CRUD日誌
public class RepositoryManager : IDisposable
建立RepositoryEntityBase.cs,做爲全部Dao層的公共基類,以供繼承映射數據庫實體。code
public class RepositoryEntityBase<TEntity> : IRepository<TEntity> where TEntity : class
建立OrderDao
public class OrdersDao : RepositoryEntityBase<OrderInfoEntity>
這兩個文件內容過多,我就不粘貼到這了。
列舉幾個使用集成好的EF框架交互的例子
1.查詢當前用戶是否爲代理
public bool IsAgent(string username) { using (var repMgr = new RepositoryManager()) { return repMgr.Exist<UsersEntity>(u => u.UserName == username && u.Role == 1); } }
2.判斷用戶名密碼是否正確
public string SearchUser(string username,string pwd) { using (var repMgr = new RepositoryManager()) { var queryuser = repMgr.FirstOrDefault<UsersEntity>(u => u.UserName == username && u.Password == pwd); } }
3.分頁查詢訂單
public QueryResponse Query(QueryRequest request) { using (var repMgr = new RepositoryManager()) { var response = new QueryResponse(); var query = repMgr.Query<OrderInfoEntity>(); int count = query.Count(); var results = query.OrderByDescending(s => s.OptTime).Skip((request.CurrentPage - 1) * request.PageSize).Take(request.PageSize); var entities = results.ToList(); response.TotalCount = count; response.Result = entities.ConvertAll(Mapper.Map<OrderInfoEntity, OrderInfo>); return response; } }
4.建立訂單
public OrderInfo CreateOrder(OrderInfo order) { using (var repMgr = new RepositoryManager()) { var entity = Mapper.Map<OrderInfo, OrderInfoEntity>(order); repMgr.Insert(entity); repMgr.Commit(); order.Id = entity.Id; } }
整個數據庫的查詢和操做至關簡單。這裏您可能會問,若是有一些複雜的Sql語句,要怎麼寫,這裏咱們在RepositoryManager.cs裏提供執行Sql語句的方法,只須要把sql與參數傳遞進來便可
public int ExecuteSqlCommand(string sql, params object[] args) { return Context.Database.ExecuteSqlCommand(sql, args); }
若是有新的業務接入,那咱們只須要在DatebaseContext中加入新的DBSet,建立對應Entity與表,其餘不須要任何改動,整個EF的接入是超級便捷的。
以上爲你們實現系統集成EF的關鍵配置代碼,因爲篇幅較長,部分源碼我並未粘貼全,你們若是感興趣,能夠私信小墨公衆號,聯繫,下一節咱們將繼續芒果系統的快速搭建,IOC集成Castle。整個系列我將面向入門級新手,以實戰乾貨角度爲你們陸續呈現,以後將爲你們呈現以.Net Core MVC姿式構建系列,但願你們支持。如需源碼,請關注小墨公衆號私信,並獲取更多小墨精彩分享!
感謝閱讀!
本文由博客羣發一文多發等運營工具平臺 OpenWrite 發佈