Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

One to many relationship between AspNetUsers (Identity) and a custom table

I'm desperate trying to create an One to Many relationship between AspNetUsers table of Identity 2.0 and a custom table called Map (One user can have many maps, but a map can only have one user) I've tryied mostly every solutions available in this website and also lost many days trying other soulutions found in the web. I'm stuck. Nothing seems to work for me. I'm new to MVC and EF so basically I think I need some sort of step-by-step guide. Can anyone please be very kind to provide me a newbie guide to achieve this from a fresh made MVC5 Project. Thanks and sorry for the redundad question I've made.

PS. I can and I'm successful on creating everykind of relationshipt between two custom tables, but not between AspNetUsers and my Map table. Thanks very very much in advance.

like image 775
SergioPetrarca Avatar asked Apr 22 '15 09:04

SergioPetrarca


2 Answers

Here is a step by step solution with visuals (It uses inheritance):

https://practiceaspnet.wordpress.com/2015/04/03/adding-asp-net-identity-to-an-existing-entity-framework-asp-net-web-forms-application/

like image 127
renakre Avatar answered Nov 10 '22 07:11

renakre


I have done exactly this on a number of projects

For instance i have a one to many relationship from ASPNetUsers to Notifications. So in my ApplicationUser class inside IdentityModels.cs i have

public virtual ICollection<Notification> Notifications { get; set; }

My Notifications class has the reverse

public virtual ApplicationUser ApplicationUser { get; set; }

By default EF will then create a cascade delete from Notification to AspNetUsers which i dont want - so i also have this in my Context class

modelBuilder.Entity<Notification>()
    .HasRequired(n => n.ApplicationUser)
    .WithMany(a => a.Notifications)
    .HasForeignKey(n => n.ApplicationUserId)
    .WillCascadeOnDelete(false);

Just remember the definition for AspNetUSers is extended in the ApplicationUser class inside IdentityModels.cs that is generated for you by visual studios scaffolding. Then treat it as any other class/table in your app

UPDATE - here are examples of full models

public class ApplicationUser : IdentityUser
{

    [StringLength(250, ErrorMessage = "About is limited to 250 characters in length.")]
    public string About { get; set; }

    [StringLength(250, ErrorMessage = "Name is limited to 250 characters in length.", MinimumLength=3)]
    public string Name { get; set; }

    public DateTime DateRegistered { get; set; }
    public string ImageUrl { get; set; }

    public virtual ICollection<Notification> Notifications { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}


public class Notification
{
    public int ID { get; set; }

    public int? CommentId { get; set; }

    public string ApplicationUserId { get; set; }

    public DateTime DateTime { get; set; }

    public bool Viewed { get; set; }

    public virtual ApplicationUser ApplicationUser { get; set; }

    public virtual Comment Comment { get; set; }

}

}

like image 14
Symeon Breen Avatar answered Nov 10 '22 06:11

Symeon Breen