Search code examples
c#entity-frameworkasp.net-coreasp.net-identityrazor-pages

AspNetCore.Identity.IdentityUser to System.collection.Generic.ICollection


I'm doing a hobby project for myself and later turn it into a portfolio work. I'm working in Entityframework 6, with razor pages.

My class UserModel is a child of the IdentityUser class. (I presume you know what an IdentityUser, if not) https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-7.0

Inside the UserModel I also stores an Icollection of GroupClass. My GroupClass has an ICollection of UserModels. Which creates a many to many relationship in EF6.

When i try to store the UserModel object in the groupclass, i get the error: Cannot implicitly convert type to AspNetCore.Identity.IdentityUser to System.collection.Generic.ICollection. What i understand is, i somehow need to change the class groupClass. To be able to store an identity variable instead of a Icollection usermodel. ` What i don't understand is, why isn't UserModel already a part of IdentityUser, as it's a child and should have the same parameters as it's parent.

My question is, how do i store the UserModel inside my groupclass?

public class GroupClassModel
    {
        [Key]
        public int GroupClassID { get; set; }
        //   info dump removed
        public string userID { get; set; }
        public ICollection<UserModel>? userModels { get; set; }

    }
public class UserModel : IdentityUser
    {

  
         // info dump removed
 
        public int? groupClassID { get; set; }
        public ICollection<GroupClassModel>? GroupClass{ get; set; }


     
    }

            if (ModelState.IsValid)
            {
              
                 //info removed
                if (newGroup == null)
                {
                    var NewGroup = new GroupClassModel()
                    {                     
                        userModels = await userManager.GetUserAsync(User)

                    };
                    Context.groupClass.Add(NewGroup );
                    Context.SaveChanges();

                }

                return RedirectToPage("Index");
            }
            return Page();
    public class Context : IdentityDbContext
    {
        Context(DbContextOptions<Context> options) : base(options)
        {
        }    
        public DbSet<GroupClassModel> groupClassModels { get; set; }
        public DbSet<UserModel> UserModels { get; set; }

        public DbSet<MasterModel> MasterModels { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
          
            base.OnModelCreating(modelBuilder);
          
        }
    }

`

I tried changing the Icollection in both classes to Icollection. same problem. I tried changing Icollection To IdentityUser but i got tons of other errors. Now i'm 50/50 if latter is the correct way of doing this.


Solution

  • GroupClassModel.userModels is a collection of UserModels. This line of code is trying to set that property to a single instance of a UserModel.

    // this generates an error
    userModels = await userManager.GetUserAsync(User);
    

    Instead you need to instantiate a new collection and add the current user's UserModel to that collection. (You're also going to need to cast the return value of userManager.GetUserAsync, which is an IdentityUser, to UserModel.)

    userModels = new List<UserModel>();
    // currentUser is an IdentityUser
    var currentUser = await userManager.GetUserAsync(User);
    // cast the IdentityUser to a UserModel
    UserModel currentUserModel = (UserModel)currentUser;
    userModels.Add(currentUserModel);