2016-04-10 20 views
0

私はC#ベースのODataソースを持っていますが、$ expandを動作させるのに問題があります。 StackOverFlowに関連するすべての記事は、OData V4の下で動作する/動作しないコントローラメソッドパターンがたくさんあるため、OData V4以前を参照しているようです。

私の問題:私は2つのエンティティTable1とTable2を持っています。そこには多対1の関係があります。 Table1には、その関係を円滑にするために使用されるFK Table2Idを持つTable2というナビゲーションプロパティがあります。

[Serializable, DataContract] 
    public class Table1 
    { 
    [DataMember, Key] 
    public int Id { get; set } 
    [DataMember] 
    public Table2 Table2 { get; set; } 
    [DataMember, ForeignKey("Table2")] 
    public int Table2Id { get; set;} 
    } 

    [Serializable, DataContract] 
    public class Table2 
    { 
    [DataMember, Key] 
    public int Id { get; set } 
    public string Name { get; set;} 
    } 

私はURL送信時:

http://localhost/OData4/api/Table1s?$expand=Table2 

を私はエラーを取得:

The query specified in the URI is not valid. Could not find a property named 'Table2' on type 'System.Web.OData.Query.Expressions.SelectAllAndExpand_1OfTable1

は、ここに私のコントローラです:

[EnableQuery] 
public IHttpActionResult Get(ODataQueryOptions<Table1> queryOptions) 
{ 
    IQueryable result; 

    // validate the query. 
    try 
    { 
    queryOptions.Validate(_validationSettings); 

    var dataSet = container.Get().AsQueryable(); // I can see Table1.Table2 here 
    result = queryOptions.ApplyTo(dataSet); // result has list of Table1 with Table2 nav property 
    } 
    catch (ODataException ex) 
    { 
    throw new HttpRequestException(ex.Message); 
    } 

    return Ok(result, result.GetType()); 
} 

protected IHttpActionResult Ok(object content, Type type) 
{ 
    Type resultType = typeof (OkNegotiatedContentResult<>).MakeGenericType(type); 
    return Activator.CreateInstance(resultType, content, this) as IHttpActionResult; 
} 

これはApplyTo鋳造に関連すると思われますその結果はTable1型はもはやそのようなラッパーではありません。しかし、このメソッドで例外がスローされることなく、私は問題が実際にどこにあるのか把握できません。

私はnuGetパッケージ 'Microsoft ASP.Net Web API 2.2を使用しています。 OData V4.0 'V5.9.0用です。

答えて

0

私が正しく読んでいれば、問題はTable1の外部キーの宣言にあると思います。あなたは 'Table2'という名前でリストされていますが、それより下の表2の外部キーIDは 'Table2ID'という名前のプロパティです。

これを試してください:あなたの[DataMember, ForeignKey("Table2")][DataMember, ForeignKey("Table2Id")]

に変更する必要があります

[Serializable, DataContract] 
    public class Table1 
    { 
    [DataMember, Key] 
    public int Id { get; set } 
    [DataMember] 
    public Table2 Table2 { get; set; } 
    [DataMember, ForeignKey("Table2Id")] 
    public int Table2Id { get; set;} 
    }