2013-07-08 45 views
1

我目前正在检查已有的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),但唉,没有任何工作。

有没有人有任何线索让我跟随?提前致谢!

+0

在$ metadata文档中,Relation类型定义是否具有引用“TestProject_Models_User_Relation_TestProject_Models_Relation_RelationPartner”关联的导航属性?我假设用户类型定义确实有这样的导航属性。 –

回答

2

当您的课程标记为[DataContract]时,模型构建器仅挑选标记为[DataMember]的公共属性。因此,我不确定模型构建者如何计算出User上的导航属性CountryRelation

当然,您可以明确告诉模型构建器任何无法推断的导航属性。示例代码,

var relations = modelBuilder.EntitySet<Relation>("Relations"); 
var countries = modelBuilder.EntitySet<Country>("Countries"); 
var users = modelBuilder.EntitySet<User>("Users"); 
users.HasRequiredBinding(u => u.Country, countries); 
users.HasRequiredBinding(u => u.Relation, relations); 
relations.HasRequiredBinding(r => r.Country, countries); 
relations.HasManyBinding(r => r.Users, users); 

其他方法是在导航属性上添加DataMember属性以及让模型构建器自动对它们进行定位。

+0

你的第一个建议是那个!我的想法是,在导航属性中添加'[DataMember]'并不重要,因为我将它看作不属于某个属性(这当然是愚蠢的)。也因为用户没有这些属性,我认为将它们添加到关系并不重要。但它确实有帮助,非常感谢! – Kazu