如何使用OdataController使用Web Api服务?

问题描述:

我打电话服务这个网址:http://localhost:7951/odata/Student 但我得到了错误如何使用OdataController使用Web Api服务?

找不到404

我在哪里做错了吗?

我的DbContext类如下:

public class DataContext : DbContext 
{ 
    public DataContext() 
     : base("name=FrameworkConnStr") 
    { 
    } 

    public DbSet<Student> Students { get; set; } 
    public DbSet<StudentAddress> StudentAddresses { get; set; } 
} 

[Table("M_DEMIR.STUDENT")] 
public partial class Student 
{ 
    public Student() 
    { 
     StudentAddress = new HashSet<StudentAddress>(); 
    } 

    [Column("ID"), Key] 
    public int Id { get; set; } 

    [Column("NAME", TypeName = "varchar2"), MaxLength(25)] 
    public string Name { get; set; } 

    [Column("SURNAME", TypeName = "varchar2"), MaxLength(50)] 
    public string Surname { get; set; } 

    public virtual ICollection<StudentAddress> StudentAddress { get; set; } 
} 

[Table("M_DEMIR.STUDENTADDRESS")] 
public partial class StudentAddress 
{ 
    [Column("ID"), Key] 
    public int Id { get; set; } 

    [Column("STUDENT_ID")] 
    public int StudentId { get; set; } 

    [Column("CITY", TypeName = "varchar2"), MaxLength(25)] 
    public string City { get; set; } 

    [ForeignKey("StudentId")] 
    public virtual Student Student { get; set; } 
} 

控制器代码是如下:

[EnableQuery] 
public class StudentController : ODataController 
{ 
    DataContext db = new DataContext(); 


    public IHttpActionResult Get() 
    { 
     return Ok(); 
    } 


} 

而且WebApiConfig守则如下:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     var builder = new ODataConventionModelBuilder(); 
     builder.EntitySet<Student>("Students"); 
     builder.EntitySet<StudentAddress>("StudentAddresses"); 
     config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel()); 
    } 

我在哪里做错了?

+1

你会得到什么错误? –

+0

我更新了问题。 – Demirline

+0

'EnableQuery'应该在'Get'方法上。将'ODataRoute'添加到Get方法。将ODataRoutePrefix(“Students”)添加到您现在具有EnableQuery的类定义中。将您的网址更改为“http:// localhost:7951/odata/Students”(添加了一个s)。 – Igor

[ODataRoutePrefix("Students")] 
public class StudentController : ODataController 
{ 
    DataContext db = new DataContext(); 

    [EnableQuery(MaxTop = 100)] // MaxTop so you can use the $top in the query string 
    [ODataRoute] 
    public IHttpActionResult Get() 
    { 
     return Ok(db.Students); // you do want to return something that can be queried 
    } 
} 

将网址变更为http://localhost:7951/odata/Students(添加一个或多个)。

另外不要忘记通过覆盖控制器的Dispose方法来处置您的DbContext实例。

+0

ODataRoutePrefix和ODataRoute无法正常工作。它们不在Odata.dll中吗? – Demirline

+0

@Demirline - 它们位于命名空间'System.Web.OData.Routing',程序集'System.Web.OData'中。 – Igor

+0

嗨Igor.Thank你的帮助。我在WebapiConfig中出错。代码是config.MapODataServiceRoute(“odata”,“odata”,builder.GetEdmModel());错误是“类型'Microsoft.OData.Edm.IEdmModel'在未引用的程序集中定义,您必须添加对程序集'Microsoft.OData.Edm,Version = 6.5.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35' 。” – Demirline