2016-04-07 5 views
0

ODataメソッドを切り替えるときに、文字列をキーとして整数ではなくキーとして使用する際に問題が発生しています。どのようなものであれ整数のように振る舞うようですね??ODataメソッドのキーを整数から文字列に変更する

古い方法(整数に気づく):

[EnableQuery] 
public SingleResult<Order> Get([FromODataUri] int key) 
{ 
    IQueryable<Order> result = db.Orders.Where(o => o.OrderId == key); 
    return SingleResult.Create(result); 
} 

古いURL(素晴らしい仕事):

api/orders(250)/ 

新しいメソッド(文字列に注意してください):

[EnableQuery] 
public SingleResult<Order> Get([FromODataUri] string key) 
{ 
    IQueryable<Order> result = db.Orders.Where(o => o.MyCustomId == key); 
    return SingleResult.Create(result); 
} 

新しいURL となります。

api/orders('13-Abc.56.77.Blah.Blah')/ 

マイウェブAPIルーティングは次のようになります。

public static void Register(HttpConfiguration config) 
{ 
    // Web API configuration and routes 
    config.MapHttpAttributeRoutes(); 

    //OData configuration 
    ODataModelBuilder builder = new ODataConventionModelBuilder(); 
    builder.EntitySet<Order>("orders"); 
    builder.EntityType<Order>().Function("getordersummary").Returns<OrderSummary>(); 

    var _model = builder.GetEdmModel(); 
    var defaultConventions = ODataRoutingConventions.CreateDefaultWithAttributeRouting(config, _model); 
    var conventions = defaultConventions.Except(defaultConventions.OfType<MetadataRoutingConvention>()); 

    config.MapODataServiceRoute(
     routeName: "ODataRoute", 
     routePrefix: "api", 
     routingConventions: conventions, 
     pathHandler: new DefaultODataPathHandler(), 
     model: _model); 

    //make uri calls much easier 
    config.EnableUnqualifiedNameCall(true); 

    //ensure JSON responses 
    var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"); 
    config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType); 
} 

新しいURLは動作しません:

/api/orders('13-2011.01')/ 
/api/orders(13-2011.01)/ 
/api/orders('ABC')/ 
/api/orders(ABC)/ 

しかし、新しいURLはのための作業を行います。

/api/orders(13201101)/ 
/api/orders(123)/ 

デバッグ中に新しい "Get"コントローラメソッドにブレークポイントを設定した場合、新しいURLは次のようになりますときlyがヒットを取得します:

/api/orders(13201101)/ 

新しいURLは次のようになります場合は、ブレークポイントがヒットしません。私のSQL Serverデータベーステーブルで

/api/orders('13-2011.01')/ 
/api/orders(13-2011.01)/ 

が、私は主を作りましたキー[MyCustomId]フィールド。次に、EntityFrameworkモデル(.edmx)を更新し、[Order]クラスの[MyCustomId]フィールドにEntityキーを割り当てました。 URLはまだ正しく動作しません。

ルーティングに問題がありますか? なぜ新しいURLは、 "[FromODataUri] string key"と明確に定義されている場合に限り、整数だけを受け入れますか?

**アップデート:私のURLに「ドット」を許可するための書き換えハンドラが既に追加されています。私はそれを言及すべきです。それは正常に動作し、この移行前に作業していました。たとえば、次のようなURLがあります。

http://www.mywebsite.com/MyApplication/OrderInfo/OrderSummary/13-2011.01/ 

これは単純に機能しないODataメソッドです。

+0

ところで、あなたのURIに後続のスラッシュは必要ありません。それらは無害です(OData URIパーサーは無視しています)が、技術的には間違っています。 – lencharest

答えて

2

データモデルのOrderエンティティタイプのキープロパティを変更していません。 ODataConventionModelBuilderというコンベンションでは、クラスFooのキープロパティを検出するために、FooIdまたはIdという名前のプロパティ(大文字と小文字を区別しません)を検索します。したがって、OrderクラスのキープロパティはまだOrderIdです。これは整数です。 (MetadataRoutingConventionを有効にして/api/$metadataを取得すると、これが当てはまります。)

Orderエンティティタイプに整数値のキーがあると、ルーティングエンジンはリソースパス/api/orders(key)に整数構文の値を探しています。モデルバインドエンジンは、Getメソッドでパラメータとして使用するために整数を文字列に変換します。

次のいずれかの方法で問題を解決することができます

  • OrderIdからMyCustomIdの名前を変更し、Key属性でOrderId注釈MyCustomId
  • 何か他のものに名前を変更し、それによって ODataConventionModelBuilderで使用される命名規則をオーバーライド
+0

うわー、ありがとう!私の.edmx/EFモデルを更新して新しいプライマリキーを使用しても、フィールドに[Key]属性を使用するように強制しているようです。非常に奇妙な。私もedmxに問題があり、それを更新していました。大きな痛み。 – AussieJoe

関連する問題