Search code examples
wcfentity-frameworkwcf-data-servicesodataentity-framework-5

WCF Odata Entity Framework Relationship Names


I'm having an issue with EF code first and Odata.

If I navigate to the metadata then I find that all of my relationships are defined like this:

<NavigationProperty Name="Jobs" ToRole="Jobs" FromRole="Applicant" Relationship=".Applicant_Jobs"/>

Notice the full stop before the relationship name?

This stops me from adding a service reference to a Console Application. It gives a custom tool error:

Schema specified is not valid. Errors: The relationship attribute is invalid - The value '.Applicant_Jobs' is invalid according to its datatype.

My data contract is defined here:

[DataContract]
public class Applicant
{
[DataMember]
public int ID { get; set; }

[DataMember]
public string Forename { get; set; }

[DataMember]
public string Surname { get; set; }

[DataMember]
public string EmailAddress { get; set; }

[DataMember]
public string PassPhrase { get; set; }

[DataMember]
public string City { get; set; }

[DataMember]
public string County { get; set; }

[DataMember]
public string Country { get; set; }

[DataMember]
public DateTime CreationDate { get; set; }

[DataMember]
public ICollection<Job> Jobs { get; set; }
}

[DataContract]
public class Job
{
[DataMember]
public Applicant Applicant { get; set; }

[DataMember]
public JobStatus JobStatus { get; set; }

[DataMember]
public int ID { get; set; }

[DataMember]
[ForeignKey("Applicant")]
public int ApplicantID { get; set; }

[DataMember]
[ForeignKey("JobStatus")]
public int JobStatusID { get; set; }

[DataMember]
public string JobTitle { get; set; }

[DataMember]
public string WebsiteURL { get; set; }

[DataMember]
public string Reference { get; set; }

[DataMember]
public string Location { get; set; }

[DataMember]
public string Salary { get; set; }

[DataMember]
public string ContactName { get; set; }

[DataMember]
public string ContactEmail { get; set; }

[DataMember]
public string ContactPhone { get; set; }

[DataMember]
public string Pros { get; set; }

[DataMember]
public string Cons { get; set; }

[DataMember]
public string GeneralNotes { get; set; }

[DataMember]
public DateTime CreationDate { get; set; }

[DataMember]
public bool Archived { get; set; }

[DataMember]
public ICollection<JobProgression> JobProgress { get; set; }
}

As you can see, I'm not putting a full stop anywhere, but for some reason one is generated for each relationship in my model, meaning the custom tool fails.


Solution

  • It turns out the contract needs to be in a namespace. That's what the provider was trying to put in front of the dot.