1

OData に関する質問が続々と寄せられています :)

次のような複合キーを持つエンティティがあります。

public class Entity
{
    public virtual Int32  FirstId  { get; set; }
    public virtual Guid   SecondId { get; set; }
    public virtual First  First    { get; set; }
    public virtual Second Second   { get; set; }
}

の複合キーを処理するCompositeKeyRoutingConventionを作成しましたODataController。次のようなナビゲーション リンクを除いて、すべてが機能しています。

http://localhost:51590/odata/Entities(FirstId=1,SecondId=guid'...')/First

Firefox で次のエラー メッセージが表示されます。

<?xml version="1.0" encoding="utf-8"?>
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  <m:code />
  <m:message xml:lang="en-US">No HTTP resource was found that matches the request URI 'http://localhost:51950/odata/Entities(FirstId=1,SecondId=guid'a344b92f-55dc-45aa-b92f-271d74643493')/First'.</m:message>
  <m:innererror>
    <m:message>No action was found on the controller 'Entities' that matches the request.</m:message>
    <m:type></m:type>
    <m:stacktrace></m:stacktrace>
  </m:innererror>
</m:error>

ASP.NET ソース コードのエラー メッセージから、空のリストを返すApiControllerActionSelector の FindMatchingActions メソッドまでた​​どりましたが、ASP.NET に関する私の知識はそこで終わりです。

参考までに、これはナビゲーション リンク アクション メソッドの実装です ( 内ODataController):

public First GetFirst(
    [FromODataUri(Name = "FirstId")] Int32 firstId, 
    [FromODataUri(Name = "SecondId")] Guid secondId)
{
    var entity = repo.Find(firstId, secondId);
    if (entity == null) throw new HttpResponseException(HttpStatusCode.NotFound);
    return entity.First;
}

属性に名前を設定せずFromODataUri、小文字の名前を設定するなど、考えられるすべてのことを試しました。私が気付いた唯一のことは、通常の使用時EntitySetControllerに、キー値の引数に名前を付ける必要があるkey(またはFromODataUri属性の Name プロパティを に設定する必要があるkey) ことです。そうしないと機能しません。ここもこんな感じなのかしら…。

4

1 に答える 1