我目前正在检查已有的Web Api项目上OData的可能性。使用代码首先,我从头开始创建所有模型,以便我可以绝对控制它们。但是,即使我已经在代码中添加了导航属性,但是通过OData提供的元数据链接检出它们时,它们中的一些还缺少。缺少现有的导航属性
例如,我有一个用户类,它从一个Person类继承而来:当我做这个GET请求
[DataContract]
[KnownType(typeof(User))]
public abstract class Person
{
[DataMember]
public int ID { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public Nullable<int> CountryID { get; set; }
[DataMember]
public Nullable<int> RelationID { get; set; }
public virtual Country Country { get; set; }
public virtual Relation Relation { get; set; }
}
现在,使用/User(1284)/Relation
(或/Country
对这个问题)我得到完全相同我想要的关系或乡村课程。但问题是,我不能拨打/Relation(16)/Country
,因为这种关联不存在。
[DataContract]
public class Relation
{
[DataMember]
public int ID { get; set; }
[DataMember]
public string Number { get; set; }
[DataMember]
public string Serial { get; set; }
[DataMember]
public Nullable<int> CountryID { get; set; }
public virtual Country Country { get; set; }
public virtual List<User> Users { get; set; }
}
但是正如您所看到的,在我的关系类中,肯定存在这样的导航属性。此外,当你看的DbContext类:
public DbSet<Relation> Relations { get; set; }
public DbSet<Country> Countries { get; set; }
public DbSet<User> Users { get; set; }
和WebApiConfig
ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<Relation>("Relations");
modelBuilder.EntitySet<Country>("Countries");
modelBuilder.EntitySet<User>("Users");
你可以看到,实际上关系和用户几乎是相同的导航性能方面,至少在国家,他们是相同的。
只是,正如我所说,当我看着通过的OData本身提供的元数据:
<Association Name="TestProject_Models_User_Country_TestProject_Models_Country_CountryPartner">
<End Type="TestProject.Models.Country" Role="Country" Multiplicity="0..1" />
<End Type="TestProject.Models.User" Role="CountryPartner" Multiplicity="0..1" />
</Association>
<Association Name="TestProject_Models_User_Relation_TestProject_Models_Relation_RelationPartner">
<End Type="TestProject.Models.Relation" Role="Relation" Multiplicity="0..1" />
<End Type="TestProject.Models.User" Role="RelationPartner" Multiplicity="0..1" />
</Association>
你可以看到,用户 - >国家和用户>的关系存在,但相对于国家的协会和用户丢失。但是,在数据库中,这些关系确实存在并且外键已经存在。当我在NuGet控制台中运行更新数据库时,我也收到通知,说明没有代码更新要完成。
我已经放弃了我的整个数据库,让CodeFirst重新创建了一切;更新到OData的最新稳定版本(从4.0.0到4.0.30506),但唉,没有任何工作。
有没有人有任何线索让我跟随?提前致谢!
在$ metadata文档中,Relation类型定义是否具有引用“TestProject_Models_User_Relation_TestProject_Models_Relation_RelationPartner”关联的导航属性?我假设用户类型定义确实有这样的导航属性。 –