skip to Main Content

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?

2

Answers


  1. 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>();
    
    Login or Signup to reply.
  2. 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.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search