我有一个基于C#的OData源代码,我在让$expand工作时遇到了问题。StackOverFlow的所有相关文章似乎都提到了OData之前的V4,因为许多控制器方法模式只是在OData V4下不适用/工作。
我的问题是:我有两个实体-- Table1和Table2,它们之间存在着多对一的关系。Table1有一个名为Table2的导航属性,FK Table2Id用于促进这种关系。
[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我收到一个错误:
URI中指定的查询无效。无法在'System.Web.OData.Query.Expressions.SelectAllAndExpand_1OfTable1类型上找到名为“Table2”的属性
这是我的控制器:
[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 2.2,用于OData V4.0‘V5.9.0。
发布于 2016-06-14 15:05:51
如果我正确阅读,我认为问题存在于您在Table1中的外键声明中。表2列出了它的名称,但是下面的属性(我想是表2中的外键id )被命名为'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;}
}您的[DataMember, ForeignKey("Table2")]应该更改为[DataMember, ForeignKey("Table2Id")]
https://stackoverflow.com/questions/36535285
复制相似问题