asp.net使用WebAPI和EF框架結(jié)合實(shí)現(xiàn)數(shù)據(jù)的基本操作
本章節(jié)主要介紹使用WebAPI和EF框架結(jié)合,實(shí)現(xiàn)數(shù)據(jù)的基本操作功能。
一、資料準(zhǔn)備
數(shù)據(jù)庫腳本:
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('開發(fā)部')
insert into Dept(DeptName) values('測(cè)試部')
insert into Dept(DeptName) values('實(shí)施部')
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(1,'劉德華','13887855552','武漢',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(2,'張學(xué)友','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,'周潤(rùn)發(fā)','13554588745','南京',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(3,'李連杰','13998759654','上海',6500)
select * from Dept;
select * from Employee;二、數(shù)據(jù)列表
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 });
}接口測(cè)試地址:
http://localhost:1894/api/Employee
三、組合條件搜索
接受搜索條件的實(shí)體:
public class SearchDto
{
public int DeptId { get; set; } //部門編號(hào)
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 });
}接口測(cè)試:

四、組合條件搜索加分頁
接受搜索條件的實(shí)體:
public class SearchDto
{
public int DeptId { get; set; } //部門編號(hào)
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 });
}接口測(cè)試:

五、數(shù)據(jù)的新增
API接口方案一:(直接使用EF中實(shí)體接受新增的數(shù)據(jù))
[HttpPost]
//此處為降低前端和EF框架實(shí)體的耦合性,也可以重新定義Dto類,然后將Dto數(shù)據(jù)通過映射,賦值到EF中Employee對(duì)象中
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接受數(shù)據(jù),直接通過屬性賦值實(shí)現(xiàn)Dto對(duì)象向EF實(shí)體的轉(zhuǎn)換)
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)
{
//屬性依次賦值實(shí)現(xiàn)Dto對(duì)象向EF實(shí)體對(duì)象的轉(zhuǎn)換
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組件進(jìn)行映射)
AutoMapper組件可以在NuGet中進(jìn)行安裝,經(jīng)過測(cè)試在framework4.5中無法使用,在framework4.7.1中可以正常使用。
如果沒有安裝framework4.7.1,可以在官網(wǎng)下載 .NET Framework 4.7.1 Developer Pack。
如果通過項(xiàng)目的屬性面板中修改了目標(biāo)框架為framework4.7.1,程序可能會(huì)編譯錯(cuò)誤,需要修改配置文件:
compilerOptions="/langversion:6 /nowarn:1659;1699;1701"
修改成:
compilerOptions="/langversion:Default /nowarn:1659;1699;1701"
API接口代碼:(兩種類型屬性名稱完全相同的時(shí)候)
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)
{
//兩種類型屬性名稱相同自動(dòng)映射
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接口代碼:(兩種類型屬性名稱不一致的時(shí)候)
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)
{
//兩種類型名屬性相同自動(dòng)映射
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 = "添加失敗" });
}接口測(cè)試:(使用EmpAddDto接受數(shù)據(jù)的時(shí)候注意參數(shù)名稱需要和EmpAddDto的屬性名相同)

到此這篇關(guān)于WebAPI和EF框架結(jié)合實(shí)現(xiàn)數(shù)據(jù)操作的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- EF?Core的CRUD(增刪改查)基本操作
- .NET Core API之格式化輸出對(duì)象OutputFormatter
- EF?Core基礎(chǔ)入門教程
- ASP.NET Core使用EF保存數(shù)據(jù)、級(jí)聯(lián)刪除和事務(wù)使用
- ASP.NET?Core使用EF查詢數(shù)據(jù)
- ASP.NET?Core使用EF為關(guān)系數(shù)據(jù)庫建模
- ASP.NET?Core使用EF創(chuàng)建關(guān)系模型
- ASP.NET?Core基于現(xiàn)有數(shù)據(jù)庫創(chuàng)建EF模型
- Entity?Framework?Core基于數(shù)據(jù)模型創(chuàng)建數(shù)據(jù)庫
相關(guān)文章
ASP.NET MVC中HtmlHelper控件7個(gè)大類中各個(gè)控件使用詳解
本文主要介紹HtmlHelper類控件的使用方法,給初涉MVC的朋友一些幫助,有需要的朋友可以參考一下。2016-03-03
ASP.NET My97DatePicker日期控件實(shí)現(xiàn)OA日期記事功能
這篇文章主要介紹了ASP.NET My97DatePicker日期控件實(shí)現(xiàn)OA日期記事功能的相關(guān)資料,需要的朋友可以參考下2016-04-04
Asp.net?MVC中的Http管道事件為什么要以Application_開頭(原因解析)
在ASP.NET?MVC中,為了在API請(qǐng)求結(jié)束時(shí)釋放數(shù)據(jù)庫鏈接,避免連接池被爆掉,可以通過在Global.asax.cs文件中定義并實(shí)現(xiàn)Application_EndRequest方法來實(shí)現(xiàn),本文介紹Asp.net?MVC中的Http管道事件為什么要以Application_開頭,感興趣的朋友一起看看吧2024-12-12
asp.net實(shí)現(xiàn)的MD5加密和DES加解密算法類完整示例
這篇文章主要介紹了asp.net實(shí)現(xiàn)的MD5加密和DES加解密算法類,結(jié)合完整實(shí)例形式分析了asp.net實(shí)現(xiàn)MD5加密算法及DES加密和解密的相關(guān)技巧,需要的朋友可以參考下2016-07-07
解析GridView自帶分頁及與DropDownList結(jié)合使用
本文主要介紹了GridView自帶的分頁功能的實(shí)現(xiàn)方法。具有一定的參考價(jià)值,需要的朋友一起來看下吧2016-12-12
ASP.NET Core依賴注入系列教程之控制反轉(zhuǎn)(IoC)
這篇文章主要給大家介紹了關(guān)于ASP.NET Core依賴注入系列教程之控制反轉(zhuǎn)(IoC)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
.NET性能調(diào)優(yōu)之一:ANTS Performance Profiler的使用介紹
本系列文章主要會(huì)介紹一些.NET性能調(diào)優(yōu)的工具、Web性能優(yōu)化的規(guī)則(如YSlow)及方法等等內(nèi)容。成文前最不希望看到的就是園子里不間斷的“哪個(gè)語言好,哪個(gè)語言性能高”的爭(zhēng)論,不多說,真正的明白人都應(yīng)該知道這樣的爭(zhēng)論有沒有意義,希望我們能從實(shí)際性能優(yōu)化的角度去討論問題2013-01-01
收集學(xué)習(xí)asp.net比較完整的面向?qū)ο箝_發(fā)流程
如果你已經(jīng)有較多的面向?qū)ο箝_發(fā)經(jīng)驗(yàn),跳過以下這兩步 第一步:掌握一門.NET面向?qū)ο笳Z言第二步:對(duì).NET Framework類庫有一定的了解;在具備了OO基礎(chǔ)之后,以下是具體的學(xué)習(xí)ASP.NET技術(shù)步驟2012-12-12

