我有一个基于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;}
}
当我发送网址时:
http://localhost/OData4/api/Table1s?$expand=Table2
我收到错误:
URI中指定的查询无效。找不到名为' 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软件包&#39; Microsoft ASP.Net Web API 2.2。对于OData V4.0&#39; V5.9.0。
答案 0 :(得分:0)
如果我正确阅读,我认为问题在于您在Table1中声明外键。你将它列为名称'Table2',但它下面的属性,我想象的是表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")]