J'ai un nouveau projet ASP.NET MVC 5.1 utilisant l'identité ASP.Net . Il semble fiable et prometteur, mais aujourd'hui, je passe presque 9 heures à faire des choses simples si vous utilisez SQL.
Mon problème est, je ne peux pas créer une table via CodeFirst avec une référence de clé étrangère à la table par défaut AspNetUsers.
Par exemple: J'ai créé une table nommée - Adresse _
public class Address
{
[Key]
public string UserId { get; set; }
public string MyAddress { get; set; }
}
Mais comment puis-je créer une référence de clé étrangère à AspNetUsers?
J'essaie de remplacer la propriété ci-dessus par
public IdentityUser MyAddress { get; set; }
// Or
public virtual IdentityUser MyAddress { get; set; }
// Or
public virtual ApplicationUser MyAddress { get; set; }
Mais tous montrent encore une erreur:
One or more validation errors were detected during model generation:
MiaPos.Models.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType.
MiaPos.Models.IdentityUserRole: : EntityType 'IdentityUserRole' has no key defined. Define the key for this EntityType.
IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined.
IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.
J'essaie également de remplacer le OnModelCreating de ce post
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
}
Mais quand je lance (Add-Migration} _, il crée les tables IdentityUserLogin, IdentityRole, IdentityUserRole et le duplique, mais le préfixe est différent. (AspNet <-> identité)
Enfin, je le fais en SQL en 10 secondes, mais je veux juste savoir pourquoi je ne peux pas le faire dans CodeFirst? Et pourquoi si difficile de faire une telle chose à partir de Microsoft 2014 Nouvelle technologie .
Vous pouvez faire comme ça. parce que parfois vous aurez besoin d'une connexion 1-1
public class AnotherTable
{
[Key]
public string UserId { get; set; }
[ForeignKey("UserId")]
public virtual ApplicationUser User { get; set; }
}
Merci Gábor Plesz pour le commentaire ci-dessus.
J'ai trouvé la solution.
La classe ApplicationUser qui hérite de IdentityUser (qui crée la table AspNetUsers) doit créer une propriété ICollection de la classe enfant (table enfant).
par exemple.
public virtual ICollection<ToDo> ToDoes { get; set; }
Ainsi, la classe ToDo peut faire référence à ApplicationUser
Je recommande vivement de jeter un coup d’œil à l’échantillon comme indiqué dans Gábor Plesz.
Si vous voulez vraiment créer une table nommée Address au lieu de créer une propriété nommée Address à générer sous forme de colonne dans la table AspNetUsers, procédez comme suit (obs: dans ce cas, je suppose qu'un utilisateur peut avoir plusieurs adresses):
À votre classe d'adresse:
public class Address
{
public string MyAddress { get; set; }
// referencing the AspNetUsers table ( ApplicationUser.cs)
public string UserId { get; set; }
public virtual ApplicationUser User { get; set; }
}
Votre classe ApplicationUser:
public virtual ICollection<Address> Addresses { get; set; }
Dans votre méthode DBContext dans OnModelCreating, procédez comme suit (API fluide):
builder.Entity<Address>()
.HasOne(c => c.User)
.WithMany(x => x.Addresses)
.HasForeignKey(f => f.UserId)
.HasConstraintName("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
OBS: N'oubliez pas d'ajouter au-dessus de la méthode OnModelCreating cette ligne de code:
public DbSet<Address> Addresses { get; set; }
Après avoir exécuté ces commandes dans votre console du gestionnaire de packages:
Add-Migrations UserAddress
et après:
Update-Database.
Mais, si vous voulez simplement inclure une nouvelle propriété aux utilisateurs AspNet, créez simplement dans votre fichier/classe ApplicationUser.cs cette propriété:
public class ApplicationUser : IdentityUser
{
public string Address { get; set; }
}
et lancez les mêmes commandes pour votre PMC:
Add-Migration UserAddress
après:
Update-Database
J'espère que cela t'aides!