Home > Back-end >  When creating a one-to-one relationship in an entity it throws an error The navigation property 
When creating a one-to-one relationship in an entity it throws an error The navigation property 

Time:02-21

I want to create one to one relation between tables. My table is

public class StudentModel
    {
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime DateOfBirth { get; set; }

        [Required, Display(Name="Department Name")]
        public int DeptId { get; set; }


        //navigration proprty
        [ForeignKey("DeptId")]
        public virtual DepartmentModels Department { get; set; }
        public virtual StudentRegistrationModels StudentRegistration { get; set; }
    }

and my other table is

public class StudentRegistrationModels
    {
        [Key]
        public int StudentId { get; set; }

        [Required]
        public int CourseId { get; set; }

        [Required]
        public DateTime EnrollDate { get; set; }
        public bool IsPaymentComplete { get; set; }


        //navigration proprty
        [ForeignKey("StudentId")]
        public virtual StudentModel Student { get; set; }

        [ForeignKey("CourseId")]
        public virtual CourseModels Course { get; set; }
        //oneToOneStudentRegistration
    }

But when I make migration it throws an error:

Unable to determine the principal end of an association between the types 'StudentManagementSystem.Models.StudentModel' and 'StudentManagementSystem.Models.StudentRegistrationModels'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

Why is this occurring?

CodePudding user response:

I believe the issue is that you have a single StudentRegistrationModel instance in your StudentModel, where the StudentRegistrationModel looks to be more of a Many-to-Many structure. Can a single student only be registered to a single course? If that were the case it would make more sense for StudentModel to just have a CourseModel reference. Since a Student probably has multiple courses, it would probably make more sense for StudentModel to have:

public virtual ICollection<StudentRegistrationModels> StudentRegistration { get; set; } = new List<StudentRegistrationModels>();

Then ensuring that your model configuration maps out the relationship. This can be done with an attribute, as part of the DbContext OnModelCreating, or using an EntityTypeConfiguration. With Attributes:

[InverseProperty("Student")] // Tells EF this collection corresponds to the Student on the StudentRegistrationModel.
public virtual ICollection<StudentRegistrationModels> StudentRegistration { get; set; } = new List<StudentRegistrationModels>();

CodePudding user response:

Maybe try to add [Key] annotation to Id field in StudentModel.

using System.ComponentModel.DataAnnotations;


public class StudentModel
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime DateOfBirth { get; set; }

    [Required, Display(Name="Department Name")]
    public int DeptId { get; set; }


    //navigration proprty
    [ForeignKey("DeptId")]
    public virtual DepartmentModels Department { get; set; }
    public virtual StudentRegistrationModels StudentRegistration { get; set; }
}

or if it won't work try map relationship in OnModelCreating in your data context.

  • Related