【问题标题】:How can I use Web Api Service with OdataController?如何将 Web Api 服务与 OdataController 一起使用?
【发布时间】:2017-02-05 05:20:31
【问题描述】:

我正在使用此 URL 调用服务:http://localhost:7951/odata/Student 但我得到了错误

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

我哪里做错了?

【问题讨论】:

  • 你得到什么错误?
  • 我更新了问题。
  • EnableQuery 应该在 Get 方法上。将ODataRoute 添加到Get 方法中。将ODataRoutePrefix("Students") 添加到您现在拥有EnableQuery 的类定义中。将您的网址更改为 http://localhost:7951/odata/Students(添加了一个 s)。
  • 谢谢你的回答。你能给我更新代码吗?
  • @Demirline - 如果这对您有用,请考虑在 15 分钟期限到期后接受答案(请参阅 How to accept SO answers)。

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


【解决方案1】:
[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(添加一个s)。

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

【讨论】:

  • ODataRoutePrefix 和 ODataRoute 不起作用。它们不在 Odata.dll 中吗?
  • @Demirline - 它们位于命名空间 System.Web.OData.Routing、Assembly System.Web.OData
  • 嗨,Igor。感谢您的帮助。我在 WebapiConfig 中出错。代码为 config.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());错误是“类型‘Microsoft.OData.Edm.IEdmModel’是在未引用的程序集中定义的。您必须添加对程序集‘Microsoft.OData.Edm, Version=6.5.0.0, Culture=neutral, PublicKeyToken= 31bf3856ad364e35'。”
  • @Demirline - 你必须安装 NuGet 包 Microsoft.OData.CoreMicrosoft.OData.Edm
  • 嗨,Igor。如果我在包管理器控制台中运行“Install-Package Microsoft.AspNet.Odata”命令,则会出现此错误。(无法安装包'Microsoft.Extensions.DependencyInjection.Abstractions 1.0. 0') 你能帮帮我吗?
猜你喜欢
  • 2019-03-05
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 2015-09-30
相关资源
最近更新 更多