Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Eins-zu-viele-Beziehung zwischen AspNetUsers (Identität) und einer benutzerdefinierten Tabelle

Genau das habe ich bei einer Reihe von Projekten getan

Zum Beispiel habe ich eine Eins-zu-Viele-Beziehung von ASPNetUsers zu Benachrichtigungen. Also habe ich in meiner ApplicationUser-Klasse in IdentityModels.cs

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

Meine Notifications-Klasse hat das Gegenteil

public virtual ApplicationUser ApplicationUser { get; set; }

Standardmäßig erstellt EF dann eine Kaskadenlöschung von der Benachrichtigung an AspNetUsers, die ich nicht möchte - also habe ich dies auch in meiner Kontextklasse

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

Denken Sie daran, dass die Definition für AspNetUSers in der Klasse „ApplicationUser“ innerhalb von „IdentityModels.cs“ erweitert wird, die von Visual Studios Scaffolding für Sie generiert wird. Behandeln Sie sie dann wie jede andere Klasse/Tabelle in Ihrer App

UPDATE - hier sind Beispiele für vollständige Modelle

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; }

}

}