Search code examples
c#asp.netasp.net-mvcef-code-firstnavigation-properties

MVC Code First using Navigation Properties


It is a simple system for comments and messages. They have also two actors: FromActor and ToActor... My codes are like this:

 public class Comment
 {        
    public int Id { get; set; } 
    public string Title { get; set; }
    public string Text { get; set; }
    public virtual Actor AboutActor { get; set; }        
    public virtual Actor FromActor { get; set; }
 }

 public class Message
 {
    public int Id { get; set; }       
    public string Title { get; set; }       
    public string Text { get; set; }       
    public virtual Actor ToActor { get; set; }
    public virtual Actor FromActor { get; set; } 
}

public class Actor  
{       
    public int Id { get; set; }       
    public string Username { get; set; }
    public virtual List<Comment> Comments { get; set; }
    public virtual List<Message> Messages { get; set; }
}

I'm in trouble with navigation props in code first. Is it true? How should I edit navigation links or models for solution? Thanks...


Solution

  • You should add additional references to Comments and Messages at Actor class and use InversePropertyAttribute to map them with corresponding properties. Also you can declare FKs directly:

    public class Comment
    {        
        //other stuff...
        public int AboutActorId { get; set; }        
        public int FromActorId { get; set; }
        public virtual Actor AboutActor { get; set; }        
        public virtual Actor FromActor { get; set; }
    }
    
    public class Message
    {
        //other stuff...
        public int ToActorId { get; set; }        
        public int FromActorId { get; set; }
        public virtual Actor ToActor { get; set; }
        public virtual Actor FromActor { get; set; } 
    }
    
    public class Actor  
    {       
        public int Id { get; set; }       
        public string Username { get; set; }
    
        [InverseProperty("AboutActor")]
        public virtual ICollection<Comment> CommentsAbout { get; set; }
        [InverseProperty("FromActor")]
        public virtual ICollection<Comment> CommentsFrom { get; set; }
    
        [InverseProperty("ToActor")]
        public virtual ICollection<Message> MessagesTo { get; set; }
        [InverseProperty("FromActor")]
        public virtual ICollection<Message> MessagesFrom { get; set; }
    }