如何在使用Breeze EdmBuilder时添加EntitySet

时间:2014-04-04 02:11:46

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

最终编辑:对于正在搜索的其他人,我会将答案放在顶部。主要问题是由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; }
    }
}

1 个答案:

答案 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; }
    }
}