在上一篇文章中,我们已经搭建了整个芒果后台管理系统整个工程架构,并集成了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 (null); 使用空策略初始化ef 。添加dbset,用于操作表。
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 发布