2016-08-03 15 views
0

我有一个拥有两个导航属性的拥有类,每个导航属性引用一个ContactInfo对象,一个用于所有者属性,另一个用于紧急联系人属性。如何配置一个OData v4模型,使多个导航道具到同一张表

[Table ("A_OWNERSHIP")] 
public class Ownership { 

    public Ownership() {} 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    [Required] 
    [Column("OWNER_ID")] 
    public int ownerID { get; set; } 

    [Column("EMERGENCY_CONTACT_ID")] 
    public int? emergencyContactID { get; set; } 

    // ** other members ellided ** 

    public virtual ContactInfo owner { get; set; } 

    public virtual ContactInfo emergencyContact { get; set; } 
} 

当我试图通过我的OData服务URL来获得所有权的集合:

http://localhost:52283/odata/Ownership 

我收到以下错误:

ORA-00904: \"Extent1\".\"ContactInfo_ID\": invalid identifier","type":"Oracle.ManagedDataAccess.Client.OracleException" 

据我了解,这个错误是类似于这个问题发生了什么:

Error while configuring multiple Navigation Properties to same table

问题是我正在使用OData v4,它引用System.Web.OData.Builder而不是System.Web.Http.OData.Builder。这意味着使用WithMany()调用来使用Fluent API来配置实体的答案(如在链接问题中)会失败,因为System.Web.OData.Builder中没有WithMany()调用。

回答

0

原来的相关对象需要他们相关的集合属性饰有InverseProperty属性:

public class ContactInfo { 

    public ContactInfo() { 

     this.owners = new HashSet<Ownership>(); 
     this.emergencyContacts = new HashSet<Ownership>(); 
    } 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    // *** other members ellided ***  

    [InverseProperty("owner")] 
    public virtual ICollection<Ownership> owners { get; private set; } 

    [InverseProperty("emergencyContact")] 
    public virtual ICollection<Ownership> emergencyContacts { get; private set; } 
} 
相关问题