Personnaliser SimpleMembership

Après avoir lu ce bon BLOG sur l’ajout de données personnalisées à la table UserProfile, je voulais le modifier de la même manière que la table UserProfile devrait stocker les données par défaut + une autre classe dans laquelle toutes les informations supplémentaires sont stockées.

Après avoir créé un nouveau projet à l’aide du modèle d’application Interenet, j’ai créé deux classes:

Étudiant.cs

[Table("Student")] public class Student { [Key] [DatabaseGeneratedAtsortingbute(DatabaseGeneratedOption.Identity)] public virtual int StudentId { get; set; } public virtual ssortingng Name { get; set; } public virtual ssortingng Surname { get; set; } public virtual int UserId { get; set; } } 

UserProfile.cs

 [Table("UserProfile")] public class UserProfile { [Key] [DatabaseGeneratedAtsortingbute(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } public ssortingng UserName { get; set; } public virtual int StudentId { get; set; } public virtual Student Student { get; set; } } 

De plus, j’ai supprimé la définition UserProfile de AccountModel.cs. Ma classe de contexte DB ressemble à ceci:

MvcLoginDb.cs

 public class MvcLoginDb : DbContext { public MvcLoginDb() : base("DefaultConnection") { } public DbSet UserProfiles { get; set; } public DbSet Students { get; set; } } 

encore une fois, j’ai supprimé la définition de contexte de firebase database de AccountModel.cs.

Dans Package-Manager-Console, j’ai écrit:

 Enable-Migrations 

et mon Configuration.cs ressemble à ceci:

 internal sealed class Configuration : DbMigrationsConfiguration { public Configuration() { AutomaticMigrationsEnabled = true; } protected override void Seed(MvcLogin.Models.MvcLoginDb context) { WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); if (!WebSecurity.UserExists("banana")) WebSecurity.CreateUserAndAccount( "banana", "password", new { Student = new Student { Name = "Asdf", Surname = "Ggjk" } }); } } 

C’était l’ idée d’append les données des étudiants lors de la création d’une nouvelle classe, mais cette approche ne fonctionne pas car, après avoir exécuté Update-Database -Verbose, j’obtiens le message d’ erreur suivant: Aucun mappage n’existe pour le type d’object MvcLogin.Models.Student vers un object géré géré. type de fournisseur natif.

Quelqu’un peut-il expliquer pourquoi je reçois cette erreur, devrais-je utiliser une approche différente pour stocker des données supplémentaires dans une autre table?

J’ai beaucoup lutté avec le même problème. La clé consiste à obtenir une relation correcte entre la classe UserProfile et votre classe Student. Pour fonctionner correctement, il faut que ce soit une relation un à un.

Voici ma solution:

Personne.cs

 public class Person { [Key] public int Id { get; set; } public ssortingng Name { get; set; } /* and more fields here */ public virtual UserProfile UserProfile { get; set; } } 

UserProfile.cs

 public class UserProfile { [Key] [DatabaseGeneratedAtsortingbute(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } public ssortingng UserName { get; set; } public virtual Person Person { get; set; } } 

MyDbContext.cs

 public class MyDbContext : DbContext { public DbSet Person { get; set; } public DbSet UserProfile { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasRequired(u => u.Person) .WithOptional(p => p.UserProfile) .Map(m => m.MapKey("PersonId")); } } 

Cependant, j’ai également eu du mal à créer des utilisateurs avec la méthode WebSecurity.CreateUserAndAccount. J’ai donc fini par créer mes objects Personne avec Entity Framework, puis le compte d’utilisateur avec la méthode du fournisseur d’appartenance:

AccountRepository.cs

  public Person CreatePerson(ssortingng name, ssortingng username) { Person person = new Person { Name = name }; _dbContext.Person.add(person); _dbContext.SaveChanges(); var membership = (SimpleMembershipProvider)Membership.Provider; membership.CreateUserAndAccount( model.UserName, createRandomPassword(), new Dictionary{ {"PersonId" , person.Id}} ); } 

HenningJ, je cherche une réponse à la même chose. Malheureusement (je suis sûr que vous êtes au courant), le problème avec votre façon de procéder est qu’il n’ya pas de transaction SQL. SaveChanges () ou CreateUserAndAccount () pourraient ne pas réussir à laisser votre firebase database utilisateur dans un état non valide. Vous devez effectuer une restauration en cas d’échec.

Je cherche toujours la réponse finale, mais je posterai la solution qui me convient le mieux. En espérant éviter d’avoir à écrire un fournisseur d’adhésion personnalisé (AGAIN!), Mais commencer à penser que ce serait plus rapide.