我目前正在检查 OData 在现有 Web Api 项目上的可能性。使用 Code First,我从头开始创建所有模型,以便完全控制它们。但是,即使我在代码中添加了导航属性,当我通过 OData 提供的元数据链接检查它时,其中一些在架构中仍然丢失。
例如,我有一个继承自 Person 类的 User 类:
[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; }
}
现在,当我对此进行 GET 请求时,使用/User(1284)/Relation
(或/Country
就此而言)我得到了我想要的 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>
可以看到 User->Country and User->Relation 存在,但是缺少 Relation 到 Country 和 User 的关联。然而,在数据库中,这些关系确实存在并且外键就位。当我在 NuGet 控制台中运行 Update-Database 时,我还会收到没有代码更新要做的通知。
我已经删除了整个数据库并让 CodeFirst 重新创建所有内容;更新到 OData 的最新稳定版本(从 4.0.0 到 4.0.30506),但唉,没有任何工作。
有没有人有任何线索让我跟随?提前致谢!