angyLe
5/3/2017 - 7:54 AM

Create many to many relationship .net core

Create many to many relationship .net core

For example relationship bettween User - Venue is many to many

1. Add many-To-many table
namespace ForumWeb.Models
{
    public class UserVenues
    {
        // [Key] is defined with fluent API in ApplicationDbContext
        public string ApplicationUserId { get; set; }
        public ApplicationUser User { get; set; }
        public int VenueId { get; set; }
        public virtual Venue Venue { get; set; }
    }
}

2. Add to User model field UserVenues
public class ApplicationUser : IdentityUser
    {
        public string Name { get; set; }

        public ICollection<UserVenues> UserVenues { get; set; }

        public ApplicationUser()
        {
            UserVenues = new List<UserVenues>();
        }
    }
    
3. It is not nessecary to have Users List in Venue model thats why i didnt change Venue

4. Add to  application context 
protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            
            // EF Core does not allow composite keys with data annotations as of yet.

            builder.Entity<UserVenues>()
              .HasKey(uv => new { uv.ApplicationUserId, uv.VenueId });
              
              
           
            // created table for many-to-many relationships for UserVenues
            builder.Entity<UserVenues>()
              .HasOne(v => v.User)
              .WithMany(v => v.Venues)
              .HasForeignKey(v => v.ApplicationUserId)
              .OnDelete(DeleteBehavior.Cascade);

            builder.Entity<UserVenues>()
                .HasOne(v => v.Venue)
                .WithMany()
                .HasForeignKey(v => v.VenueId)
                .OnDelete(DeleteBehavior.Cascade);
                
There is 3 options
Cascade - зависимый объект удаляется при удалении главного
SetNull - в зависимом объекте выставляется NULL
Restrict - нечего не  изменяется при удалении