asp.net使用WebAPI和EF框架结合实现数据的基本操作

目录
  • 一、资料准备
  • 二、数据列表
  • 三、组合条件搜索
  • 四、组合条件搜索加分页
  • 五、数据的新增

本章节主要介绍使用WebAPI和EF框架结合,实现数据的基本操作功能。

一、资料准备

数据库脚本:

create table Dept --部门信息
(
	DeptId int primary key identity(1,1),
	DeptName varchar(50) not null
)

create table Employee	--员工信息
(
	EmpId int primary key identity(1,1),
	DeptId int not null,
	EmpName varchar(50) not null,
	EmpPhone varchar(50) not null,
	EmpArea varchar(50) not null,
	EmpSalary decimal(18,2) not null
)

insert into Dept(DeptName) values('开发部')
insert into Dept(DeptName) values('测试部')
insert into Dept(DeptName) values('实施部')

insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(1,'刘德华','13887855552','武汉',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(2,'张学友','13556528634','深圳',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(3,'刘亦菲','13448494546','广州',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(1,'周杰伦','13888666855','北京',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(2,'许巍','13868654219','上海',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(3,'孙燕姿','13895133572','成都',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(1,'朴树','13458788896','武汉',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(2,'周润发','13554588745','南京',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(3,'李连杰','13998759654','上海',6500)

select * from Dept;
select * from Employee;

二、数据列表

API接口:

[HttpGet]
public IHttpActionResult Get()
{
    var data = from emp in db.Employee
                join dept in db.Dept on emp.DeptId equals dept.DeptId
                select new
                {
                    EmpId = emp.EmpId,
                    DeptId = emp.DeptId,
                    EmpName = emp.EmpName,
                    EmpPhone = emp.EmpPhone,
                    EmpArea = emp.EmpArea,
                    EmpSalary = emp.EmpSalary,
                    DeptName = dept.DeptName
                };
    return Json(new { res = 1, msg = "", data = data });
}

接口测试地址:

http://localhost:1894/api/Employee

三、组合条件搜索

接受搜索条件的实体:

public class SearchDto
{
	public int DeptId { get; set; } //部门编号
	public string EmpName { get; set; } //部门名称
}

API接口:

[HttpGet]
[Route("api/Employee/Search")]
public IHttpActionResult Get([FromUri] SearchDto searchDto)
{
    var data = from emp in db.Employee
                join dept in db.Dept on emp.DeptId equals dept.DeptId
                select new
                {
                    EmpId = emp.EmpId,
                    DeptId = emp.DeptId,
                    EmpName = emp.EmpName,
                    EmpPhone = emp.EmpPhone,
                    EmpArea = emp.EmpArea,
                    EmpSalary = emp.EmpSalary,
                    DeptName = dept.DeptName
                };
    if (searchDto.DeptId > 0)
        data = data.Where(p => p.DeptId == searchDto.DeptId);
    if (!string.IsNullOrEmpty(searchDto.EmpName))
        data = data.Where(p => p.EmpName.Contains(searchDto.EmpName));
    return Json(new { res = 1, msg = "", data = data });
}

接口测试:

四、组合条件搜索加分页

接受搜索条件的实体:

public class SearchDto
{
	public int DeptId { get; set; } //部门编号
	public string EmpName { get; set; } //部门名称
}

API接口:

[HttpGet]
[Route("api/Employee/SearchPage")]
public IHttpActionResult Get(int page,int pagesize,[FromUri] SearchDto searchDto)
{

    var query = from emp in db.Employee
                join dept in db.Dept on emp.DeptId equals dept.DeptId
                select new
                {
                    EmpId = emp.EmpId,
                    DeptId = emp.DeptId,
                    EmpName = emp.EmpName,
                    EmpPhone = emp.EmpPhone,
                    EmpArea = emp.EmpArea,
                    EmpSalary = emp.EmpSalary,
                    DeptName = dept.DeptName
                };
    if (searchDto.DeptId > 0)
        query = query.Where(p => p.DeptId == searchDto.DeptId);
    if (!string.IsNullOrEmpty(searchDto.EmpName))
        query = query.Where(p => p.EmpName.Contains(searchDto.EmpName));
    var data = query.OrderByDescending(p => p.EmpId).ToPagedList(page, pagesize);
    return Json(new { res = 1, msg = "",total=data.TotalItemCount, data = data });
}

接口测试:

五、数据的新增

API接口方案一:(直接使用EF中实体接受新增的数据)

[HttpPost]
//此处为降低前端和EF框架实体的耦合性,也可以重新定义Dto类,然后将Dto数据通过映射,赋值到EF中Employee对象中
public IHttpActionResult Add(Employee emp)
{
    db.Employee.Add(emp);
    int r = db.SaveChanges();
    if (r == 1)
        return Json(new { res = 1, msg = "添加成功" });
    else
        return Json(new { res = 1, msg = "添加失败" });
}

API接口方案二:(使用Dto接受数据,直接通过属性赋值实现Dto对象向EF实体的转换)

public class EmpAddDto
{
    public int EmpId { get; set; }
    public int DeptId { get; set; }
    public string EmpName { get; set; }
    public string EmpPhone { get; set; }
    public string EmpArea { get; set; }
    public decimal EmpSalary { get; set; }
}

[HttpPost]
public IHttpActionResult Add(EmpAddDto dto)
{
    //属性依次赋值实现Dto对象向EF实体对象的转换
    Employee emp = new Employee();
    emp.DeptId = dto.DeptId;
    emp.EmpName = dto.EmpName;
    emp.EmpPhone = dto.EmpPhone;
    emp.EmpArea = dto.EmpArea;
    emp.EmpSalary = dto.EmpSalary;
    db.Employee.Add(emp);
    int r = db.SaveChanges();
    if (r == 1)
        return Json(new { res = 1, msg = "添加成功" });
    else
        return Json(new { res = 1, msg = "添加失败" });
}

API接口方案三:(通过AutoMapper组件进行映射)

AutoMapper组件可以在NuGet中进行安装,经过测试在framework4.5中无法使用,在framework4.7.1中可以正常使用。

如果没有安装framework4.7.1,可以在官网下载 .NET Framework 4.7.1 Developer Pack。

如果通过项目的属性面板中修改了目标框架为framework4.7.1,程序可能会编译错误,需要修改配置文件:

compilerOptions="/langversion:6 /nowarn:1659;1699;1701"

修改成:

compilerOptions="/langversion:Default /nowarn:1659;1699;1701"

API接口代码:(两种类型属性名称完全相同的时候)

public class EmpAddDto
{
    public int EmpId { get; set; }
    public int DeptId { get; set; }
    public string EmpName { get; set; }
    public string EmpPhone { get; set; }
    public string EmpArea { get; set; }
    public decimal EmpSalary { get; set; }
}
[HttpPost]
public IHttpActionResult Add(EmpAddDto dto)
{
    //两种类型属性名称相同自动映射
    var config = new MapperConfiguration(cfg => cfg.CreateMap<EmpAddDto, Employee>());
    var mapper = config.CreateMapper();
    Employee emp = mapper.Map<Employee>(dto);
    db.Employee.Add(emp);
    int r = db.SaveChanges();
    if (r == 1)
        return Json(new { res = 1, msg = "添加成功" });
    else
        return Json(new { res = 1, msg = "添加失败" });
}

API接口代码:(两种类型属性名称不一致的时候)

public class EmpAddDto
{
    public int EmpId { get; set; }
    public int DeptId { get; set; }
    public string Name { get; set; }
    public string Phone { get; set; }
    public string EmpArea { get; set; }
    public decimal EmpSalary { get; set; }
}
[HttpPost]
public IHttpActionResult Add(EmpAddDto dto)
{
    //两种类型名属性相同自动映射
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<EmpAddDto, Employee>()
        .ForMember("EmpName", opt => opt.MapFrom(src => src.Name))
        .ForMember(dest => dest.EmpPhone, opt => opt.MapFrom(src => src.Phone));
        //.ForMember(dest => dest.EmpId, opt => opt.MapFrom(src => src.EmpId))
        //.ForMember(dest => dest.DeptId, opt => opt.MapFrom(src => src.DeptId))
        //.ForMember(dest => dest.EmpName, opt => opt.MapFrom(src => src.Name))
        //.ForMember(dest => dest.EmpPhone, opt => opt.MapFrom(src => src.Phone))
        //.ForMember(dest => dest.EmpArea, opt => opt.MapFrom(src => src.EmpArea))
        //.ForMember(dest => dest.EmpSalary, opt => opt.MapFrom(src => src.EmpSalary));
    });
    var mapper = config.CreateMapper();
    Employee emp = mapper.Map<Employee>(dto);
    db.Employee.Add(emp);
    int r = db.SaveChanges();
    if (r == 1)
        return Json(new { res = 1, msg = "添加成功" });
    else
        return Json(new { res = 1, msg = "添加失败" });
}

接口测试:(使用EmpAddDto接受数据的时候注意参数名称需要和EmpAddDto的属性名相同)

到此这篇关于WebAPI和EF框架结合实现数据操作的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • ASP.NET Core使用EF为关系数据库建模

    目录 1.简介 2.表映射 2.1约定 2.2数据注释 2.3Fluent API 3.列映射 3.1约定 3.2数据注释 3.3Fluent API 4.数据类型 4.1约定 4.2数据注释 4.3Fluent API 5.主键 5.1约定 5.2数据注释 5.3Fluent API 6.默认架构 6.1约定 6.2数据注释 6.3Fluent API 7.默认值 7.1约定 7.2数据注释 7.3Fluent API 8.索引(关系数据库) 8.1约定 8.2数据注释 8.3Fluent A

  • EF Core基础入门教程

    EF Core 是一个ORM(对象关系映射),它使 .NET 开发人员可以使用 .NET对象操作数据库,避免了像ADO.NET访问数据库的代码,开发者只需要编写对象即可. EF Core 支持多种数据库引擎: Microsoft SQL Sever SQLite Npgsql MySQL ...... 1.获取EF Core 通过NuGet获取要使用的数据库支持.比如:Microsoft SQL Sever 打开NuGet程序包管理器控制台,输入:Install-PackageMicrosoft

  • .NET Core API之格式化输出对象OutputFormatter

    相信大家在项目中都用过统一响应参数模板. 先声明一个响应模板类: public class ResponseDto { public int code { get; set; } public string msg { get; set; } public object data { get; set; } } 再定义返回成功和失败的方法: public IActionResult Success(object data) { return ...... } public IActionResu

  • Entity Framework Core基于数据模型创建数据库

    1.简介 使用Entity Framework Core构建执行基本数据访问的ASP.NET Core MVC应用程序.使用迁移(Migrations)基于数据模型创建数据库,你可以在Windows上使用Visual Studio 2017 PowerShell或在Windows.macOS或Linux上使用.NET Core CLI来学习创建数据库. 2.创建新项目 2.1系统必备 在创建新项目之前都要检查是否安装以下软件:●具有以下工作负载的Visual Studio 2017 15.7版或

  • ASP.NET Core使用EF创建关系模型

    目录 1.关系 2.术语定义 3.约定 4.完全定义的关系 5.无外键属性 6.单个导航属性 7.数据注释 7.1ForeignKey 7.2InverseProperty 8.Fluent API 8.1单个导航属性 8.2ForeignKey 8.3无导航属性 9.主体密钥 10.必需和可选的关系 11.级联删除 12.其他关系模式 12.1一对一 12.1.1数据注释 12.1.2Fluent API 12.2多对多 1.关系 关系定义两个实体之间的关系.在关系型数据库中,这由外键约束表示

  • ASP.NET Core使用EF保存数据、级联删除和事务使用

    目录 1.简介 2.基本保存 2.1添加数据 2.2更新数据 2.3删除数据 2.4单个SaveChanges中的多个操作 3.保存关联数据 3.1添加关联数据 3.2添加相关实体 3.3更改关系 4.级联删除 5.事务 5.1控制事务 1.简介 每个上下文实例都有一个ChangeTracker,它负责跟踪需要写入数据库的更改.更改实体类的实例时,这些更改会记录在ChangeTracker中,然后在调用SaveChanges时会被写入数据库中.此数据库提供程序负责将更改转换为特定于数据库的操作(

  • ASP.NET Core基于现有数据库创建EF模型

    1.简介 Entity Framework Core可通过数据库提供给应用程序的插件访问许多不同的数据库.我们可以通过使用Entity Framework Core构建执行基本数据访问的ASP.NET Core MVC应用程序,对现有数据库进行反向工程以便创建Entity Framework模型. 2.创建数据库 我们可以通过Visual Studio创建一个数据库再进行演示,步骤如下:●打开Visual Studio开发工具●“工具”>“连接到数据库”●选择“Microsoft SQL Ser

  • EF Core的CRUD(增删改查)基本操作

    一.增加(C) 单笔增加 //添加 static void Add() { using (var db = new Entities()) { Student stu1 = new Student { Name = "李四", Age = 19, Adress = "合肥", PhoneNumber = "13200000000" }; //把实体对象附加到上下文 db.Student.Add(stu1); //db.Entry(stu1).St

  • ASP.NET Core使用EF查询数据

    1.查询生命周期 在进入正题时候,我们先来了解EF Core查询的生命周期. 1.1LINQ查询会由Entity Framework Core处理并生成给数据库提供程序可处理的表示形式(说白了就是生成给数据库可识别数据形式). 发送的查询结果(查询表示形式)会被缓存,以便每次执行查询时无需进行1.1中处理. 1.2查询结果(查询表示形式)会传递到数据库提供程序 数据库提供程序会识别出查询的哪些部分可以在数据库中求值. 查询的这些部分会转换为特定数据库的查询语言(例如,关系数据库的T-SQL).

  • asp.net使用WebAPI和EF框架结合实现数据的基本操作

    目录 一.资料准备 二.数据列表 三.组合条件搜索 四.组合条件搜索加分页 五.数据的新增 本章节主要介绍使用WebAPI和EF框架结合,实现数据的基本操作功能. 一.资料准备 数据库脚本: create table Dept --部门信息 ( DeptId int primary key identity(1,1), DeptName varchar(50) not null ) create table Employee --员工信息 ( EmpId int primary key iden

  • ASP.NET Core WebApi返回结果统一包装实践记录

    目录 前言 统一结果类封装 定义包装类 升级一下操作 进一步完善 漏网之鱼处理 总结 前言 近期在重新搭建一套基于ASP.NET Core WebAPI的框架,这其中确实带来了不少的收获,毕竟当你想搭建一套框架的时候,你总会不自觉的去想,如何让这套框架变得更完善一点更好用一点.其中在关于WebApi统一结果返回的时候,让我也有了更一步的思考,首先是如何能更好的限制返回统一的格式,其次是关于结果的包装一定是更简单更强大.在不断的思考和完善中,终于有了初步的成果,便分享出来,学无止境思考便无止境,希

  • 浅谈ASP.Net Core WebApi几种版本控制对比

    一.版本控制的好处: (1)有助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或作为查询字符串参数, (2)通过自定义标头和通过接受标头 在这篇文章中, 让我们来看看如何支持多个版本的 ASP.NET Core Web API. 一.创建asp.net core webapi 项目,引用NuGet包:Install-Package Microsoft.AspNetCore

  • ASP.NET Mvc开发之EF延迟加载

    先来看看定义 EF延迟加载:就是使用Lamabda表达式或者Linq 从 EF实体对象中查询数据时,EF并不是直接将数据查询出来,而是在用到具体数据的时候才会加载到内存. 一.实体对象的Where方法返回一个什么对象? 大家来看一下上一篇文章的代码来分析一下: #region 查询文章列表+ActionResult Article() /// <summary> /// 查询文章列表 /// </summary> /// <returns></returns>

  • VS2015下简单使用EF框架的方法

    VS2015下如何简单使用EF框架的方法,具体内容如下 新建Model1.edmx文件 页面引用数据库Model1 如下创建AD数据库的model文件. 找到以下菜单 找到所需要引用数据库类名称. 在页面后台引用 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; name

  • Asp.net core WebApi 使用Swagger生成帮助页实例

    最近我们团队一直进行.net core的转型,web开发向着前后端分离的技术架构演进,我们后台主要是采用了asp.net core webapi来进行开发,开始每次调试以及与前端人员的沟通上都存在这效率低下的问题,一次在看微软asp.net core官方文档的时候,发现了swagger这个好东西.然后在实际的项目中引入了该技术.我们开发人员测试自己写的api的过程大大得到了简化,前端人员也可以根据我们提供的swagger help pages 自己进行一些前端代码的测试,大大提高了前后端的开发效

  • asp.net core webapi 服务端配置跨域的实例

    在前后端分离开发中服务端仅仅只为前端提供api接口,并且前后端往往单独部署,此时就会出现浏览器跨域问题.asp.net core提供了简单优雅的解决方案. 在startup文件的Configure添加如下代码(替换"http://localhost:8080"为你的前端部署地址,此处测试的前端地址为本地的8080端口) 注:asp.net core2.0以下需安装nuget包:Microsoft.AspNetCore.Cors app.UseCors(builder => { b

  • ASP.NET Core WebAPI实现本地化(单资源文件)

    在Startup ConfigureServices 注册本地化所需要的服务AddLocalization和 Configure<RequestLocalizationOptions> public void ConfigureServices(IServiceCollection services) { services.AddLocalization(); services.Configure<RequestLocalizationOptions>(options =>

  • asp.net core webapi文件上传功能的实现

    最近开发一个新项目,使用了asp.net core 2.0,采用webapi开发后台,postgresql为数据库.最先来的问题就是上传文件的问题. POST文件的一些坑 使用默认模板创建webapi的controller后,post请求,默认有 // POST api/values [HttpPost] public void Post([FromBody]string value) { } 请求使用了[FromBody]标记,用来指示用请求体里获得数据. 对于文件上传请求,直接在这个Post

  • ASP.NET Core WebApi版本控制的实现

    前言: 在日常项目开发中,随着项目需求不断的累加.不断的迭代:项目服务接口需要向下兼容历史版本:前些时候就因为Api接口为做版本管理导致接口对低版本兼容处理不友好. 最近就像了解下如何实现WebApi版本控制,那么版本控制有什么好处呢? WebApi版本控制的好处 有助于及时推出功能, 而不会破坏现有系统,兼容性处理更友好. 它还可以帮助为选定的客户提供额外的功能. 接下来就来实现版本控制以及在Swagger UI中接入WebApi版本 一.WebApi版本控制实现 通过Microsoft.As

随机推荐