The property cannot be configured as navigation property

c# entity-framework

Question

I am trying to implement a domain model like this: My model

This is an entity framework mvc application. The code for the model looks like this:

public class Login
{
    [Key]
    public int LoginID { get; set; }

    public virtual Therapist Therapist { get; set; }

    public virtual Patient Patient { get; set; }
}

public class Patient
{
    [Key]
    [ForeignKey("Login")]
    [Display(Name = "No.")]
    public int PatientId { get; set; }

    [ForeignKey("Therapist")]
    public int TherapistId { get; set; }

    [ForeignKey("Therapist")]
    public int TherapistId{ get; set; }

    public virtual Therapist Therapist { get; set; }

    public virtual Login Login { get; set; }
}

public class Therapist
{
    [Key]
    [ForeignKey("Login")]
    [Display(Name = "No.")]
    public int TherapistId { get; set; }

    [ForeignKey("Login")]
    public int LoginId { get; set; }

    public virtual Login Login { get; set; }

    public virtual ICollection<Patient> Patients { get; set; }
}

I follow exactly what is in the tutorials and stack overflow questions, and no matter what I do, when I try to run the controller, I get the same error:

Unable to retrieve metadata for 'Patient'. The property "TherapistId" cannot be configured as navigation property. The property must be a valid entity type and the property should have non-abstract getter and setter. For collection properties the type must implement ICollection where T is a valid entity type

I have no idea what is wrong with TherapistId - maybe the whole idea of the model is rubbish?

1
5
8/31/2018 6:06:56 AM

Popular Answer

I think your specific error in this case is that you have

[ForeignKey("TherapistId")]
public int? TherapistId { get; set; }

instead of

[ForeignKey("Therapist")]
public int? TherapistId { get; set; }

In any event, you do seem to have a few problems, maybe something like this (I only preserved relationship properties):

public class Login
{
    [Key]
    public int LoginID { get; set; }

    public virtual Therapist Therapist { get; set; }
    public virtual Patient Patient { get; set; }
}

public class Patient
{
    [Key]
    [ForeignKey("Login")]
    [Display(Name = "No.")]
    public int PatientId { get; set; }

    public virtual Login Login { get; set; }

    // was this supposed to be optional?
    [ForeignKey("Therapist")]
    public int? TherapistId{ get; set; }

    public virtual Therapist Therapist { get; set; }
  }

public class Therapist
{
    [Key]
    [ForeignKey("Login")]
    [Display(Name = "No.")]
    public int TherapistId { get; set; }
    public virtual Login Login { get; set; }

    public virtual ICollection<Patient> Patients { get; set; }
}

Usually, for one-to-one relationships in EF, both sides of the relationship must have the same primary key.


In fact, for what you're doing, maybe you could try using inheritance of some sort between Login, Patient, and Therapist, because at the moment, a Login could have both a Patient and Therapist.

19
6/6/2015 12:02:17 AM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow