欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC5实现芒果分销后台管理系统(二):Code First快速集成EntityFramework

程序员文章站 2023-02-18 12:28:42
在上一篇文章中,我们已经搭建了整个芒果后台管理系统整个工程架构,并集成了AutoMapper,日志组件等,接下来我们将使用Entity Framework完善系统的持久化存储部分。这篇EF的构造,我将以一种快速集成的方式实现,并提供超多的Linq公共方法供业务使用。 Nuget引入EF 在XiaoM ......

在上一篇文章中,我们已经搭建了整个芒果后台管理系统整个工程架构,并集成了automapper,日志组件等,接下来我们将使用entity framework完善系统的持久化存储部分。这篇ef的构造,我将以一种快速集成的方式实现,并提供超多的linq公共方法供业务使用。

nuget引入ef

在xiaomo.repository工程里,右键工程使用nuget引入entityframework ,这里我使用最新的6.4版本

ASP.NET MVC5实现芒果分销后台管理系统(二):Code First快速集成EntityFramework

在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

ASP.NET MVC5实现芒果分销后台管理系统(二):Code First快速集成EntityFramework

对应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姿势构建系列,希望大家支持。如需源码,请关注小墨公众号私信,并获取更多小墨精彩分享!

感谢阅读!

ASP.NET MVC5实现芒果分销后台管理系统(二):Code First快速集成EntityFramework

本文由博客群发一文多发等运营工具平台 openwrite 发布