在上一篇文章中,我們已經搭建了整個芒果後臺管理系統整個工程架構,並集成了AutoMapper,日誌組件等,接下來我們將使用Entity Framework完善系統的持久化存儲部分。這篇EF的構造,我將以一種快速集成的方式實現,並提供超多的Linq公共方法供業務使用。 Nuget引入EF 在XiaoM ...
在上一篇文章中,我們已經搭建了整個芒果後臺管理系統整個工程架構,並集成了AutoMapper,日誌組件等,接下來我們將使用Entity Framework完善系統的持久化存儲部分。這篇EF的構造,我將以一種快速集成的方式實現,並提供超多的Linq公共方法供業務使用。
Nuget引入EF
在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=**" />
創建表
創建表以及Entity
對應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; }
}
EF關鍵配置
創建資料庫交互上下文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; }
}
添加數據交互介面,這裡只列出幾個關鍵介面方法
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層的公共基類,以供繼承映射資料庫實體。
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 發佈