2016-04-10 13 views
0

Ich habe eine C# -basierte OData-Quelle und ich habe Probleme, $ expand zu arbeiten. Alle verwandten Beiträge zu StackOverFlow scheinen sich auf OData V4 zu beziehen, da viele der Controller-Methodenmuster unter OData V4 nicht gelten/funktionieren.

Mein Problem: Ich habe zwei Entitäten Table1 und Table2, wo es eine viele-zu-eins-Beziehung zwischen ihnen gibt. Tabelle1 hat eine Navigationseigenschaft namens Table2 mit FK Table2Id, die diese Beziehung erleichtert.

[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;} 
    } 

Wenn ich die URL senden:

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

bekomme ich einen Fehler:

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

Hier ist mein Controller:

[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; 
} 

Dies ist auf die ApplyTo Casting im Zusammenhang scheint die Ergebnisse in etwas, das nicht ist Table1 Typ mehr, aber ein Wrapper für solche. Aber ohne Ausnahme in der Methode kann ich nicht herausfinden, wo das Problem tatsächlich ist.

Ich benutze nuGet Paket 'Microsoft ASP.Net Web API 2.2. für OData V4.0 'V5.9.0.

Antwort

0

Wenn ich richtig lese, liegt das Problem in Ihrer Deklaration des Fremdschlüssels in Tabelle1. Sie haben es mit dem Namen 'Table2' aufgelistet, aber die Eigenschaft darunter, die ich mir vorstelle, ist die Fremdschlüssel-ID aus Tabelle 2, die 'Table2ID' heißt.

Versuchen Sie folgendes:

[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;} 
    } 

Wo Ihr [DataMember, ForeignKey("Table2")] sollte [DataMember, ForeignKey("Table2Id")]

geändert werden
Verwandte Themen