0

最终编辑:我会将答案放在此处供其他正在搜索的人使用。主要问题是 db-first 生成的 EDM 将“.Models”附加到模型命名空间的末尾导致命名空间不匹配。此命名空间与 odata 命名空间不匹配,因此路由失败。我刚刚从命名空间中删除了所有出现的“.Models”,现在它可以工作了。


一个新手尝试设置了 webApiOdata 的 Breeze。对不起,如果这个问题是微不足道的。

我有一个带有 webapi odata 控制器的 db 生成的 edmx 模型。在我了解新的 Breeze EdmBuilder 之前,我一直无法获得正确的元数据来显示。

这解决了显示正确元数据的问题,但现在,我无法路由到任何表。如果我尝试 /odata/Customers 我会收到 406 错误。

之前,我使用 ODataConventionModelBuilder 设置 EntitySets 并且效果很好。

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<Detail>("Details");
    builder.EntitySet<Item>("Items");
    builder.EntitySet<Order>("Orders");
    builder.EntitySet<Customer>("Customers");

现在,由于我使用的是 EdmBuilder,如何设置 EntitySet 以便可以路由到正确的数据?

我希望这个问题是有道理的。

*编辑:我添加了 GCSodContext 列表和客户控制器的片段。

namespace GCSbz3.Models
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class GCSodContext : DbContext
    {
        public GCSodContext()
            : base("name=GCSodContext")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public virtual DbSet<Customer> Customers { get; set; }
        public virtual DbSet<Detail> Details { get; set; }
        public virtual DbSet<Item> Items { get; set; }
        public virtual DbSet<Order> Orders { get; set; }
    }
}

这是客户控制器

...
using System.Web.Http;
using System.Web.Http.ModelBinding;
using System.Web.Http.OData;
using System.Web.Http.OData.Routing;
using GCSbz3.Models;

namespace GCSbz3.Controllers
{
    public class CustomersController : ODataController
    {
        private GCSodContext db = new GCSodContext();

        // GET odata/Customers
        [Queryable]
        public IQueryable<Customer> GetCustomers()
        {
            return db.Customers;
        }
...

这是客户类。

namespace GCSbz3.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Customer
    {
        public Customer()
        {
            this.Orders = new HashSet<Order>();
        }

        public int CustID { get; set; }
        public string FName { get; set; }
        public string LName { get; set; }
        public string Phone { get; set; }

        public virtual ICollection<Order> Orders { get; set; }
    }
}
4

1 回答 1

1

检查您的 ODataController 名称,它需要与 edmx 中的 EntitySet 名称对齐。

如果集合名称是CustomerSet,控制器需要是具有公共GetCustomerSet方法的CustomerSetController 。

例如这有效;

TestDbContext.cs

public partial class TestDbContext : DbContext
{
    public TestDbContext()
        : base("name=TestDbContext")
    {}

    public virtual DbSet<A1> A1Set { get; set; }
}

A1SetController.cs

public class A1SetController : ODataController
{
    private TestDbContext db = new TestDbContext();

    // GET odata/A1Set
    [Queryable]
    public IQueryable<A1> GetA1Set()
    {
        return db.A1Set;
    }
}

以及WebApiConfig.cs中的路由设置

// OData routes
config.Routes.MapODataRoute(
    routeName: "odata",
    routePrefix: "odata",
    model: EdmBuilder.GetEdm<TestDbContext>(),
    batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));

最后,edmx 和实际模型(类)命名空间需要对齐。当您向$metadata发出请求时,您会看到为模型定义的命名空间。您可以在模型设计器中更改它,右键单击空白区域,单击属性。在属性窗口中,您可以看到命名空间属性。就我而言;

<Schema Namespace="Web">
    <EntityType Name="Customer">

Customer.cs

namespace Web
{
    using System;
    using System.Collections.Generic;

    public partial class Customer
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}
于 2014-04-04T22:00:42.387 回答