【问题标题】:Using ASP.NET Core Web API WITHOUT Entity Framework在没有实体框架的情况下使用 ASP.NET Core Web API
【发布时间】:2019-04-10 02:02:07
【问题描述】:

我需要在没有实体框架的情况下从 ASP.NET Core 构建 Web API。这是一个现有的数据库,有一些自定义存储过程,我们不想使用 EF。

我搜索了这个主题,找不到任何关于它的信息,这可能吗?

【问题讨论】:

  • EF Core 与 ASP.NET Core 无关。所以,是的。只需使用 ADO.NET
  • 是的,这是可能的。实体框架只是一种检索数据的方法,独立于 ASP.NET Core WebAPI
  • 你可以使用任何你想要的数据访问库,只要它在 .NET Core 上运行。
  • 我看到的每个例子都在使用 EF
  • 有这方面的例子吗?

标签: asp.net-core asp.net-web-api2


【解决方案1】:

这是可能的。

您将遇到的第一个问题是获取数据库连接字符串。您将需要导入配置来执行此操作。在控制器中,它可能如下所示:

    private readonly IConfiguration _configuration;

    public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuration)
    {
        _logger = logger;
        _configuration = configuration;
    }

添加using System.Datausing System.Data.SqlClient(SqlClient 需要 NuGet)以及using Microsoft.Extensions.Configuration。通过访问数据库,您正在编写“旧式”代码,例如:

    [HttpGet]
    [Route("[controller]/movies")]
    public IEnumerable<Movie> GetMovies()
    {
        List<Movie> movies = new List<Movie>();

        string connString = ConfigurationExtensions.GetConnectionString(_configuration, "RazorPagesMovieContext");
        SqlConnection conn = new SqlConnection(connString);
        conn.Open();

        SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM Movie", conn);
        DataSet ds = new DataSet();
        sda.Fill(ds);
        DataTable dt = ds.Tables[0];
        sda.Dispose();

        foreach (DataRow dr in dt.Rows)
        {
            Movie m = new Movie
            {
                ID = (int)dr["ID"],
                Title = dr["Title"].ToString(),
                ReleaseDate = (DateTime)dr["ReleaseDate"],
                Genre = dr["Genre"].ToString(),
                Price = (decimal)dr["Price"],
                Rating = dr["Rating"].ToString()
            };
            movies.Add(m);
        }
        conn.Close();
        return movies.ToArray();
    }

连接字符串名称在appsettings.json

"ConnectionStrings": {
"RazorPagesMovieContext": "Server=localhost;Database=Movies;Trusted_Connection=True;MultipleActiveResultSets=true"
 }

【讨论】:

    【解决方案2】:

    我意识到这是一个老问题,但它出现在我运行的搜索中,所以我想我会添加到给出的答案中。

    首先,如果您关心自定义存储过程,您仍然可以使用 Entity Framework 的 .FromSql 方法运行它们(请参阅此处以供参考:https://www.entityframeworktutorial.net/efcore/working-with-stored-procedure-in-ef-core.aspx) 相关信息位于页面顶部:

    EF Core provides the following methods to execute a stored procedure:
    1. DbSet<TEntity>.FromSql(<sqlcommand>)
    2. DbContext.Database.ExecuteSqlCommand(<sqlcommand>)
    

    如果您出于其他原因避免使用 Entity Framework,则绝对可以在 ASP.NET Core 中使用您想要的任何数据库连接方法。只需使用与您的数据库相关的任何库来实现您的数据库连接方法,并设置您的控制器以您想要的任何格式返回数据。大多数(如果不是全部)Microsoft 示例都返回 Entity Framework 实体,但您可以轻松返回所需的任何数据格式。

    作为示例,此控制器方法在对 MS SQL 服务器运行查询后返回一个 MemoryStream 对象(注意,在大多数情况下您希望返回数据,我的理解是它应该是一个“GET”方法,而不是“POST " 就像这里所做的那样,但我需要在 HttpPost 正文中发送和使用信息)

    [HttpPost]
    [Route("Query")]
    public ActionResult<Stream> Query([FromBody]SqlDto content)
    {
        return Ok(_msSqlGenericService.Query(content.SqlCommand, content.SqlParameters));
    }
    

    您可以返回通用 DataTable 或您想要的任何自定义类的列表,而不是 MemoryStream。请注意,您还需要确定如何序列化/反序列化数据。

    【讨论】:

      【解决方案3】:

      只是在项目中使用 Dapper 作为我们的 ORM,而不是 EF。

      https://dapper-tutorial.net/

      它类似于 ADO.Net,但它有一些我们利用的附加功能,而且实现起来非常干净。

      【讨论】:

        【解决方案4】:

        是的,这是可能的。只需自己实现 API。或者这里也是身份支架的示例,没有 EF。

        https://markjohnson.io/articles/asp-net-core-identity-without-entity-framework/

        【讨论】:

        • 感谢您的评论。 EFCore 是下一次迭代,但它似乎在幕后做了太多事情,并且需要花费大量时间进行故障排除,并且对数据库进行了太多多余/冗余的调用。此外,增加的开销对于微服务来说是可怕的。在进行并排比较之前,我被要求使用 ADO.Net——我的“原始”方法绝对是 EF 所能提供的最好的方法。不用了
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-25
        • 2016-01-03
        • 2016-05-19
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多