Dotnet
User Profile

Solution - Add Followers

PRO
Outline

Solution: Adding Followers

In the Conduit.Data Project

Add a new class named Follow with the following properties:
namespace Conduit.Data
{
    public class Follow
    {
        public int Follower { get; set; }
        public int Following { get; set; }
        public virtual Person FollowerNavigation { get; set; }
        public virtual Person FollowingNavigation { get; set; }
    }
}
The second file you'll modify is Person class by adding the following properties and create a constructor then add the following lines of code:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Conduit.Data
{
    [Table("People")]
    public class Person
    {
        [Key]
        public int Id { get; set; }

        [Required]
        [StringLength(50)]
        public string UserName { get; set; }

        [StringLength(200)]
        public string Bio { get; set; }

        [Required]
        [StringLength(200)]
        public string Image { get; set; }

        public Account Account { get; set; }
        public virtual ICollection<Follow> FollowerNavigations { get; set; }
        public virtual ICollection<Follow> FollowingNavigations { get; set; }

        public Person()
        {
            FollowerNavigations = new HashSet<Follow>();
            FollowingNavigations = new HashSet<Follow>();
        }
    }
}

Finally the third file in the Conduit.Data Project

Modify ConduitContext by adding the following property:
See code below
In the OnModelCreating method, add the following code immediately after modelBuilder.Entity<Person>() configuration call.
using Microsoft.EntityFrameworkCore;

namespace Conduit.Data
{
    public class ConduitContext : DbContext
    {
        public DbSet<Account> Accounts { get; set; }
        public DbSet<Person> People { get; set; }
        public DbSet<Follow> Follows { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Account>(entity =>...);

            modelBuilder.Entity<Person>(entity =>...);

            modelBuilder.Entity<Follow>(entity =>
            {
                entity.HasKey(e => new { e.Follower, e.Following });

                entity.HasOne(d => d.FollowerNavigation)
                    .WithMany(p => p.FollowerNavigations)
                    .HasForeignKey(d => d.Follower)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("FK_Follower_Profiles");

                entity.HasOne(d => d.FollowingNavigation)
                    .WithMany(p => p.FollowingNavigations)
                    .HasForeignKey(d => d.Following)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("FK_Following_Profiles");
            });
            base.OnModelCreating(modelBuilder);
        }

        public ConduitContext(DbContextOptions<ConduitContext> options) : base(options)...
    }
}

Let's go thru the code in the ConduitContext to get a better understanding of what it's doing.

This is the code that we use to configure the entity. The Entity meaning the Follow Class. We know that the People & Follow Class are related. We see that from the properties we set.

The configuration code we put in the ConduitContext Class is to build the structure in the database.

So let's go thru it line by line:

  • We know that "Entity" represents the Follow class. That's represented by the Generic type.
  • Therefore, entity is a Follow class which HasOne FollowerNavigation
  • The FollowerNavigation is a Person. We know that because the property type is Person.
  • That Person has many FollowingNavigations. We know that because the property is a Generic ICollection.
  • The many that are return is the Follow Class and it has a Foreign Key that is specified by the Following property.
  • Whenever it's deleted from code it deletes it on the database.
  • And finally we give it a constraint name that the database can use.

This is the configuration used to create the tables in the database.

 

I finished! On to the next chapter