【问题标题】:Implement the Entity Framework in the Web API在 Web API 中实现实体框架
【发布时间】:2016-08-12 04:11:29
【问题描述】:

我是 ASP.NET 的新手,创建了 MVC 框架 Web API,它接受 ID 数组作为输入参数并查询 Oracle DB,这应该以 JSON 格式返回结果。我们的查询类似于

SELECT STCD_PRIO_CATEGORY_DESCR.DESCR AS CATEGORY, 
      STCD_PRIO_CATEGORY_DESCR.SESSION_NUM AS SESSION_NUMBER, 
      Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE) AS SESSION_START_DATE
      from STCD_PRIO_CATEGORY 
      where STCD_PRIO_CATEGORY_DESCR.STD_REF IN(X,Y,Z)

其中 X,Y,Z 是我们将作为输入参数传递的值

我将 API 控制器创建为

  public class PDataController : ApiController
   {
    public HttpResponseMessage Getdetails([FromUri] string[] id)
    {
     List<OracleParameter> prms = new List<OracleParameter>();
     string connStr = ConfigurationManager.ConnectionStrings["PDataConnection"].ConnectionString;
     using (OracleConnection dbconn = new OracleConnection(connStr))
    {
    var inconditions = id.Distinct().ToArray();
    var srtcon = string.Join(",", inconditions);
    DataSet userDataset = new DataSet();
    var strQuery = @"SELECT STCD_PRIO_CATEGORY_DESCR.DESCR AS CATEGORY, 
      STCD_PRIO_CATEGORY_DESCR.SESSION_NUM AS SESSION_NUMBER, 
      Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE) AS SESSION_START_DATE          
      from STCD_PRIO_CATEGORY 
      where STCD_PRIO_CATEGORY_DESCR.STD_REF IN(";
    StringBuilder sb = new StringBuilder(strQuery);
     for(int x = 0; x < inconditions.Length; x++)
         {
           sb.Append(":p" + x + ",");
           OracleParameter p = new OracleParameter(":p" + x,OracleDbType.NVarchar2);
           p.Value = inconditions[x];
           prms.Add(p);
         }
    if(sb.Length > 0) sb.Length--;
    strQuery = sb.ToString() + ")"; 
    using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn))
      {
       selectCommand.Parameters.AddRange(prms.ToArray());
         using (OracleDataAdapter adapter = new OracleDataAdapter(selectCommand))
        {
            DataTable selectResults = new DataTable();
            adapter.Fill(selectResults);
            var returnObject = new { data = selectResults };
            var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json"));
            ContentDispositionHeaderValue contentDisposition = null;
            if (ContentDispositionHeaderValue.TryParse("inline; filename=ProvantisStudyData.json", out contentDisposition))
            {
                response.Content.Headers.ContentDisposition = contentDisposition;
            }
             return response;
}}}}}}

它完美地工作并返回结果为 {"data":[{"CATEGORY":"Internal Study","SESSION_NUMBER":7,"SESSION_START_DATE":"2015-02-13T00:00:00"}]}

但是想在这里使用Model和DBContext来实现实体框架。我创建了model类和DataContext Class如下

namespace PSData.Models
{ public class StudyDataModel
{ [Key]
public string CATEGORY { get; set; }
public int SESSION_NUMBER { get; set; }
public DateTime SESSION_START_DATE { get; set; }
}}

还有

namespace PSData.Models
{
 public class StudyDataContext:DbContext
 {
 public DbSet<StudyDataModel> details { get; set; }
 }}

我不确定如何在控制器中实现它们。当我尝试使用Web API 2 Controller with actions,using Entity Framework 创建控制器时,同时选择了模型类和数据库上下文类,它使用

创建控制器
 private StudyDataContext db = new StudyDataContext();
 // GET: api/StdData
 public IQueryable<StudyDataModel> Getdetails()

我不确定如何继续,因为返回类型是我返回 JSON 消息的另一个控制器中的 HttpResponseMessage。非常感谢任何帮助

【问题讨论】:

  • 您需要创建StudyDataContext 的对象,然后您可以访问详细信息属性。我建议您在构建大型系统之前至少花 30 分钟阅读 EF 基础教程。
  • @Shyju 是的,我将对象创建为private StudyDataContext db = new StudyDataContext(),所以我知道如果我使用return db.details;,它会返回模型类中的所有键。但不确定如何在返回之前将它们转换为 JSON

标签: c# asp.net asp.net-mvc entity-framework asp.net-web-api


【解决方案1】:

您不需要将其显式转换为 json 格式。 content negotiation 模块和媒体格式化程序将根据请求将数据转换为所需的格式(XML/JSON)。默认情况下它返回 JSON。

假设你有一个像这样的 DTO 类

public class CategoryDto
{
  public string Category { get; set; }
  public int SessionNumber { get; set; }
  public DateTime SessionStartDate { get; set; }
}

在你的action方法中,你可以使用Request.CreateResponse方法。

public HttpResponseMessage Get()
{
   var db = new StudyDataContext();
   var data = db.details.Select(x => new CategoryDto { 
                                                    Category = x.Category,
                                                    SessionStartDate  = x.SessionStartDate,
                                                    SessionNumber = x.SessionNumber }
                               ).ToList();
   return Request.CreateResponse(HttpStatusCode.OK, data);
}

【讨论】:

  • 谢谢。但是其他的东西在Controller中应该都是一样的。像 Oracle Connection 一样,给出查询
  • 我以为你想用你的 EF 实现替换所有的数据访问代码
  • 是的,我想替换它们。所以我们不需要任何` using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn)) { selectCommand.Parameters.AddRange(prms.ToArray());使用 (OracleDataAdapter 适配器 = new OracleDataAdapter(selectCommand)) { DataTable selectResults = new DataTable(); adapter.Fill(selectResults);` 可能我有点困惑
  • 没有。只需使用我在答案中发布的方法即可。
  • 它如何知道查询SELECT STCD_PRIO_CATEGORY_DESCR.DESCR AS CATEGORY, STCD_PRIO_CATEGORY_DESCR.SESSION_NUM AS SESSION_NUMBER, Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE) AS SESSION_START_DATE from STCD_PRIO_CATEGORY where STCD_PRIO_CATEGORY_DESCR.STD_REF IN(X,Y,Z) 我们将在哪里给他们
猜你喜欢
  • 1970-01-01
  • 2014-05-25
  • 2022-11-18
  • 2021-05-04
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
相关资源
最近更新 更多