在Web API中实现实体框架

问题描述:

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

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"}]}

不过想利用该模型在这里实现实体框架和DBContext.I创建的模型类和DataContext类如下

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() 

数据库上下文类我不知道如何着手为返回类型是我在其他控制器的HttpResponseMessage控制器在哪里我正在返回JSON消息。任何帮助大大增益​​

+0

您需要创建'StudyDataContext'对象,然后才能访问details属性。我建议你在构建大系统之前花费至少30分钟的时间完成EF基础教程。 – Shyju

+0

@Shyju是我创建的对象作为'私人StudyDataContext db = new StudyDataContext()'所以我明白,如果我使用'返回db.details;'它返回模型类中的所有键。但不知道如何将它们转换为JSON返回 – trx

你不需要明确地将其转换为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; } 
} 

,并在您的操作方法,你可以使用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); 
} 
+0

谢谢。但其他的东西在控制器中应该都是一样的。与Oracle Connection类似,给出查询 – trx

+0

我以为你想用EF实现替换所有的数据访问代码 – Shyju

+0

是的,我想替换它们。所以我们不需要任何'使用(OracleCommand selectCommand = new OracleCommand(strQuery,dbconn)) selectCommand.Parameters.AddRange(prms.ToArray()); (OracleDataAdapter adapter = new OracleDataAdapter(selectCommand)) { DataTable selectResults = new DataTable(); adapter.Fill(selectResults);'可能我有点困惑 – trx