最终编辑:对于正在搜索的其他人,我会将答案放在顶部。主要问题是由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列表和来自Customers控制器的代码段。
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;
}
...
这是Customer类。
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; }
}
}
答案 0 :(得分:1)
检查您的ODataController名称,它需要与您的edmx中的EntitySet名称对齐。
如果设置名称为 CustomerSet ,则控制器需要 CustomerSetController ,并使用公共 GetCustomerSet 方法。
例如,这有效;
<强> 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; }
}
}