最终编辑:我会将答案放在此处供其他正在搜索的人使用。主要问题是 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; }
}
}