有没有办法从不是 EntityFramework 实体的模型/类构建 Web API 控制器

问题描述 投票:0回答:3

我正在使用 .Net Core 6 和 Visual Studio 2022 社区版

VS 为 WebApi 提供了这些脚手架项目选项

所选选项会为

int id, string value
生成 CRUD 骨架,但是 如果我已经有一个模型并且想要使用该模型构建相同的 CRUD 方法,我该怎么做?

您可以假设我的模型具有此符号,以允许向导在选择自定义模型后使用它

class Person { 
    [Key]
    string id ;
}
namespace webapi_6
{
    [Route("api/[controller]")]
    [ApiController]
    public class EmployeeController : ControllerBase
    {
        // GET: api/<EmployeeController>
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/<EmployeeController>/5
        [HttpGet("{id}")]
        public string Get(int id)
        {
            return "value";
        }

        // POST api/<EmployeeController>
        [HttpPost]
        public void Post([FromBody] string value)
        {
        }

        // PUT api/<EmployeeController>/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/<EmployeeController>/5
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    }
}

我知道我可以获取生成的代码并将其更改为我的模型的类型,但是如果我有几个模型,这可能会变得无聊并且容易出错。

我还认为 VS 应该提供这个选项,因为 scoffolding 不应该仅限于实体框架。

PD:也欢迎命令行解决方案

c# visual-studio scaffolding
3个回答
1
投票

问题归结为,Visual Studio 无法假设您的模型是什么样子,以及您想要如何查找项目。例如,您的索引属性是什么属性?它可以代表您做出假设,但很可能是错误的。实体框架将所有这些信息存储在其元数据中,因此很容易识别这些信息并知道如何查询所述数据。

您还可以做什么。是制作一个通用 CRUD API 控制器,将您的模型粘附到一个接口,然后使用所述接口创建一个新模型。

示例:

namespace webapi_6
{
    public class GenericController<T> : ControllerBase where T : IMyModel
    {
        protected IStorageAccess<T> storage;
        protected GenericController(IStorageAccess<T> myStorage)
        {
           //Inject some sort of Storage here
           storage = myStorage;
        }
        [HttpGet]
        public virtual IEnumerable<T> Get()
        {
            return myStorage.Get();
        }

        [HttpGet("{id}")]
        public virtual string Get(int id)
        {
            return myStorage.Get(id);
        }

        [HttpPost]
        public virtual void Post([FromBody] T value)
        {
        }

        [HttpPut("{id}")]
        public virtual void Put(int id, [FromBody] T value)
        {
        }

        [HttpDelete("{id}")]
        public virtual void Delete(int id)
        {
        }
    }
}

然后您可以像这样为每个模型实现泛型,并根据需要重写方法。

namespace webapi_6
{
    [Route("api/[controller]")]
    [ApiController]
    public class EmployeeController : GenericController<Employee>
    {
        public EmployeeController(IStorageAccess<Employee> myStorage) : base(myStorage)
    }
}

或者可能有第 3 方插件,我还没有遇到过,但制作一个能够完成此任务的 Visual Studio 插件并不是牵强的。您甚至可以从 T4 模板开始。 https://learn.microsoft.com/en-us/visualstudio/modeling/code- Generation-and-t4-text-templates


0
投票

在最新版本的 Visual Studio 2022 中,可以根据定义的模型构建 Web API 端点并创建 MSSQL 本地数据库,而无需手动创建迁移并键入用于添加和更新数据库的命令。

使用最新的.NET版本和默认设置创建API项目。然后,创建一个仅包含一个实体的 Models 文件夹。

当模型创建成功后,脚手架技术可以创建CRUD操作。

在搭建脚手架的过程中,需要将所需的NuGet添加到解决方案中,脚手架完成后,会出现YourEntityEndpoints.cs,其中包含API调用,并且在Data文件夹中会存在FastMinimalAPIContext.cs。另外,在Program.cs中,实体框架配置将自动添加。


0
投票

创建模型/类:

首先,创建一个类或模型来表示您想要通过 Web API 公开的数据。此类不需要是实体框架实体。 添加控制器:

右键单击项目中的 Controllers 文件夹。 选择“添加”->“控制器...”。 在“添加支架”对话框中,选择左侧的“API”。 选择“带有操作的 API 控制器,使用实体框架”(即使您没有使用实体框架)。 配置脚手架:

在“模型类”下拉列表中,选择您的自定义模型或类(例如 YourModel)。 在“数据上下文类”下拉列表中,将其保留为“使用单独的数据上下文类”(因为您没有使用实体框架)。 单击“添加”。 查看并修改生成的代码:

Visual Studio 将在 Controllers 文件夹中生成一个具有基本 CRUD 操作的控制器。 打开生成的控制器文件(例如 YourModelsController.cs)并查看代码。 注意:如果您不使用实体框架进行数据访问,则可能需要调整代码。默认脚手架采用实体框架,因此您可能需要用自己的逻辑替换数据访问代码。

自定义控制器操作:

根据您的数据访问需求自定义控制器操作。您可以用自己的逻辑替换默认的基于实体框架的代码,以与数据源交互。

© www.soinside.com 2019 - 2024. All rights reserved.