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 を使用しているので、適切なデータにルーティングできるように EntitySets を設定するにはどうすればよいですか?

質問が理にかなっていることを願っています。

*編集: 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; }
    }
}

ここにCustomersコントローラーがあります

...
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; }
    }
}
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にリクエストを送信すると、モデルに定義された名前空間が表示されます。Model Designerで変更できます。空の領域を右クリックし、Propertiesをクリックします。[プロパティ] ウィンドウで、名前空間属性を確認できます。私の場合;

<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 に答える