在上一篇文章中,我们已经搭建了整个芒果后台管理系统整个工程架构,并集成了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 发布