带有实体框架的 CRUD WEB API

Posted

技术标签:

【中文标题】带有实体框架的 CRUD WEB API【英文标题】:CRUD WEB API with entity framework 【发布时间】:2020-09-24 14:35:08 【问题描述】:

我开始开发我的项目 - 使用数据库的 Web 应用程序。我使用 WEB API 和实体框架 我需要在我的项目中实现 CRUD 操作。

阅读 - 工作正常

但我不知道如何实现创建、更新、删除;我没有足够的经验,很高兴你的建议。

我尝试实现我的应用程序的良好架构 - 使用存储库模式和结构模式。如果您对我的项目架构有任何建议,我将不胜感激。

我不知道如何在值控制器和存储库中实现它,请您帮忙?

附上我的代码:

存储库

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WebAPI

    public class CustomerRepository
    
        public IQueryable<Customer> GetAllCustomers()
        
            DevelopersEntities dev = new DevelopersEntities();
            return dev.Customers;
        

        public IQueryable<Customer> GetAllCustomers(int id)
        
            DevelopersEntities dev = new DevelopersEntities();
            return dev.Customers.Where(c=>c.Id==id).Select(e=>e);
        

        public IQueryable<Customer> DeleteCustomer(int id)
        
            DevelopersEntities dev = new DevelopersEntities();
            return dev.Customers.Remove(id);
        

        public IQueryable<Customer> CreateCustomer()
        
            DevelopersEntities dev = new DevelopersEntities();


        

        public IQueryable<Customer> UpdateCustomer(int id)
        
            DevelopersEntities dev = new DevelopersEntities();

        
    

客户模型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WebAPI;

namespace DevelopersWeb.Models

    public class CustomerModel
    
        public int CustomerId  get; set; 
        public string CustomerName  get; set; 

        public IEnumerable<HardwareModel> Hardware  get; set; 
        public IEnumerable<SoftwareModel> Software  get; set; 
    

硬件模型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace DevelopersWeb.Models

    public class HardwareModel
    
        public int HardwareId  get; set; 
        public string HardwareName  get; set; 

    

软件模型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace DevelopersWeb.Models

    public class SoftwareModel
    
        public int SoftwareId  get; set; 
        public string SoftwareName  get; set; 
    

模型工厂

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WebAPI;

namespace DevelopersWeb.Models

    public class ModelFactory
    
        public CustomerModel Create(Customer customer)
        
            return new CustomerModel()
            
                CustomerId = customer.Id,
                CustomerName = customer.Name,

                Hardware = customer.HardWares.Select(h=>Create(h)),
                Software = customer.Softwares.Select(c=>Create(c))
            ;
        

        public HardwareModel Create(HardWare hardware)
        
            return new HardwareModel()
            
                HardwareId = hardware.HardWareId,
                HardwareName = hardware.HardWareName,
            ;
        

        public SoftwareModel Create(Software software)
        
            return new SoftwareModel()
            
                SoftwareId = software.SoftwareId,
                SoftwareName = software.SoftwareName
            ;
        
    

值控制器

using DevelopersWeb.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebAPI;

namespace DevelopersWeb.Controllers

    public class ValuesController : ApiController
    
        ModelFactory _modelFactory;

        public ValuesController()
        
            _modelFactory = new ModelFactory();
        
        // GET api/values
        public IEnumerable<CustomerModel> Get()
        
            CustomerRepository cr = new CustomerRepository();
            return cr.GetAllCustomers().ToList().Select(c=> _modelFactory.Create(c));
        

        // GET api/values/5
        public string Get(int id)
        
            return "xxx";
        

        // POST api/values
        public void Post([FromBody]string value)
        

        

        // PUT api/values/5
        public void Put(int id, [FromBody]string value)
        
        

        // DELETE api/values/5
        public void Delete(int id)
        
        
    


【问题讨论】:

可以阅读来自microsoftdocs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/…的文档 【参考方案1】:

以下是保存客户对象的方法:

public void CreateCustomer(Customer customer)

    DevelopersEntities dev = new DevelopersEntities();
    dev.Customers.Add(customer)
    dev.SaveChanges();

这是你的 api 操作:

  // POST api/values
    public void Post([FromBody]CustomerModel customerModel)
    
       //Here you should transform CustomerModel object to customerEntity
        CustomerRepository cr = new CustomerRepository();
        cr.CreateCusomer(customer);

        return Ok();
    

您也应该考虑在这里使用依赖注入模式。

【讨论】:

为什么你保存你不使用的客户对象 IQueryable 我不明白这是什么意思 - 在这里你应该将 CustomerModel 对象转换为 customerEntity 你能告诉我更多吗?

以上是关于带有实体框架的 CRUD WEB API的主要内容,如果未能解决你的问题,请参考以下文章

带有实体框架的 ASP.Net Core Web API 使用存储过程有啥好处吗? [关闭]

IAuthenticationFilter 中的 C# Ninject Web API 异步查询导致实体框架中的多个操作错误

使用带有实体框架 6 的存储库模式更新记录

实体框架 + Web API,在 DbContext 之外返回实体(复杂、集合等)

带有 EF Core 更新实体的 ASP.Net 核心 Web Api 如何

EasyAdmin 3:如何基于 dql 为 CRUD 索引显示实体