web-dev-qa-db-fra.com

Le type d'entité ApplicationUser ne fait pas partie du modèle pour le contexte actuel

Je migre d'Identity 1.0.0 vers Identity 2.0.1 à la suite de ceci article

et le code de migration généré ne concerne pas le nouvel IdentityUser. Il n'ajoute pas les nouvelles colonnes.

J'ai donc créé un nouveau projet et essayé à nouveau, mais les codes de migration sont vides.

Pour résoudre ce problème, j'ai effectué les modifications directement dans SQL Server et importé à nouveau ma base de données dans ma solution.

Maintenant, mon AspNetUser est exactement le même que mon IdentityUser comme vous pouvez le voir

IdentityUser

public virtual int AccessFailedCount { get; set; }

public virtual ICollection<TClaim> Claims { get; }

public virtual string Email { get; set; }

public virtual bool EmailConfirmed { get; set; }

public virtual TKey Id { get; set; }

public virtual bool LockoutEnabled { get; set; }

public virtual DateTime? LockoutEndDateUtc { get; set; }

public virtual ICollection<TLogin> Logins { get; }

public virtual string PasswordHash { get; set; }

public virtual string PhoneNumber { get; set; }

public virtual bool PhoneNumberConfirmed { get; set; }

public virtual ICollection<TRole> Roles { get; }

public virtual string SecurityStamp { get; set; }

public virtual bool TwoFactorEnabled { get; set; }

public virtual string UserName { get; set; }

IdentityUser.cs

public class ApplicationUser : IdentityUser
{
    public bool Has_accepted_policy { get; set; }
    public int user_type_id { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {

    }
}

AspNetUser

public string Id { get; set; }

[Required]
[StringLength(256)]
public string UserName { get; set; }

public string PasswordHash { get; set; }

public string SecurityStamp { get; set; }

[StringLength(256)]
public string Email { get; set; }

public bool EmailConfirmed { get; set; }

public bool Is_Active { get; set; }

[Required]
[StringLength(128)]
public string Discriminator { get; set; }

public int? user_type_id { get; set; }

public bool Has_accepted_policy { get; set; }

public string PhoneNumber { get; set; }

public bool PhoneNumberConfirmed { get; set; }

public bool TwoFactorEnabled { get; set; }

public DateTime? LockoutEndDateUtc { get; set; }

public bool LockoutEnabled { get; set; }

public int AccessFailedCount { get; set; }

... other virtual properties 

et quand j'essaie d'enregistrer un utilisateur, j'ai l'exception suivante

Le type d'entité ApplicationUser ne fait pas partie du modèle pour le contexte actuel

à cette ligne

IdentityResult result = await UserManager.CreateAsync(user, model.Password);

Mon startup.Auth.cs

UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());

Et dans mon AccountController je déclare mon UserManager comme ceci

public AccountController()
    : this(Startup.UserManagerFactory(), Startup.OAuthOptions.AccessTokenFormat)
{
}

public AccountController(UserManager<ApplicationUser> userManager,
    ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
{
    UserManager = userManager;
    AccessTokenFormat = accessTokenFormat;
}

public UserManager<ApplicationUser> UserManager { get; private set; }

Je n'ai rien changé sauf les nouvelles propriétés de la classe AspNetUser et cela fonctionnait bien avant la migration.

Il y a un problème similaire sur CodePlex marqué comme résolu mais ils ne donnent pas la solution

Est-ce que quelqu'un sait comment réparer ceci?

[~ # ~] éditer [~ # ~]

Pour être sûr, je n'ai commis aucune erreur en modifiant ma base de données SQL. J'ai créé un autre projet et généré une base de données Identity. J'ai changé la chaîne de connexion pour cette base de données et j'ai toujours la même erreur.

[~ # ~] solution [~ # ~]

Quand j'ai édité ma base de données, je n'ai pas remarqué que dans Identity 2.0.0, ils avaient changé le User_Id pour UserId dans la table AspUserClaims. Après cela, j’ai eu la même erreur mais j’ai ensuite fait ce que tschmit007 avait dit à propos de l’ajout de ApplicationDbContext au constructeur UserStore et cela fonctionne maintenant.

UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
44
Marc

pour moi, il semble manquer une instanciation de contexte:

UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());

devrait être

UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
40
tschmit007

J'avais ce même problème. Je développe d'abord la base de données avec un fichier EDMX.
Si vous utilisez la chaîne de connexion générée lors de l’ajout du fichier EDMX dans :base(“EDMXConnString”), vous aurez probablement ce problème.

J'ai résolu ce problème en créant une chaîne de connexion standard pointant vers la base de données contenant les tables d'identité ASP.NET.

<add name="MyConnString" connectionString="Data Source=server; Initial Catalog=db_name; User ID=user_id; Password=password; Connect Timeout=60;" providerName="System.Data.SqlClient" />

Et puis utilisé cette chaîne de connexion dans :base, et ça a fonctionné!

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("MyConnString")
    {
    }
}
68
James

Mon problème était que j'ai essayé d'utiliser la chaîne de connexion ADO.NET générée à la fois pour le contexte généré et le contexte d'authentification ApplicationDbContext. Je l'ai corrigé en utilisant une chaîne de connexion distincte pour l'authentification. Faites également attention au fournisseur - pour le contexte d'authentification, il doit être System.Data.SqlClient:

<add name="DefaultConnection" connectionString="Server=qadb.myserver.com;Database=mydb;User Id=myuser;Password=mypass;" providerName="System.Data.SqlClient" />
7
shturm

Si vous utilisez d'abord du code, vérifiez votre chaîne de connexion pour vous assurer que nom_fichier est 'SqlClient' comme dans nom_fichier = "System.Data.SqlClient

Si vous utilisez d'abord la base de données, vérifiez votre chaîne de connexion pour vous assurer que providerName est 'EntityClient' comme dans providerName = "System.Data.EntityClient

3
snnpro

J'ai également reçu ce message d'erreur, mais la cause et la solution étaient différentes. Dans mon cas, j'avais introduit une nouvelle propriété Id de type Guid dans ma classe ApplicationUser. Syntaxe C # parfaitement valide, mais elle a apparemment créé une confusion énorme pour le noyau Identity ou EntityFramework qui repose sur la réflexion pour rechercher des éléments.

La suppression de la nouvelle propriété Id dans ma classe ApplicationUser a résolu cette erreur.

1
dthorpe

Même problème pour moi, cela a été résolu par ce code:

public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false)
{
    Database.Connection.ConnectionString = @"data source=...;initial catalog=...;user id=...;password=...;multipleactiveresultsets=True;application name=EntityFramework";
}
1
Nabeel Ali

J'ai rencontré ce problème et il s'agissait d'un conflit de nom d'objet. IdentityConfig.cs utilisait ApplicationUser mais utilisait le programme IdentityModels.ApplicationUser généré automatiquement au lieu de mon propre contexte . ) DataAccess.ApplicationUser . Fait sens parfait une fois que je l'ai trouvé. J'ai donc supprimé le fichier IdentityModels.cs généré automatiquement du modèle WebAPI de base (je ne l'utilise plus de toute façon), puis j'ai ajouté l'instruction using dans IdentityConfig.cs à mon propre espace de noms DataAccess et à mon mappage approprié. Si vous oubliez que le modèle en construit beaucoup pour vous, vous rencontrerez le problème suivant:

public class ApplicationUserManager : UserManager<ApplicationUser> // the name conflict
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
    }
1
Auri Rahimzadeh

Mon problème était que j'avais créé un nouveau DbContext, mais il n'héritait pas d'IdentityDbContext.

Une solution facile ...

public partial class GoldfishDbContext : IdentityDbContext<ApplicationUser>
{
 ....
}
0
James Joyce

Je ne suis pas sûr que cela se produise, ma solution fonctionne parfaitement, tout a été testé avant de dormir. Après 12 heures, je l'ai vérifiée à nouveau et couru et c'était exactement la même erreur. J'ai essayé presque toutes les solutions ici dans SO mais aucune d'entre elles ne fonctionne.

J'implémente une approche de base de données ici. Puis tout à coup il y eut cette

Connexion par défaut

sur mon web.config généré par Visual Studio lorsque j'ai créé la solution pour la première fois. Donc, je l'ai utilisé à la place de la chaîne de connexion générée par mon fichier EDMX et tout à coup, ça fonctionne!

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }   
}

C'était ma chaîne de connexion qui fonctionne:

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-System.WEB-20180718085411.mdf;Initial Catalog=aspnet-System.WEB-20180718085411;Integrated Security=True" providerName="System.Data.SqlClient" />

A l'origine, j'utilise ce fichier généré par mon fichier EDMX, mais soudain, le site Web ne fonctionne plus, bien qu'il fonctionne auparavant. Je n'ai rien changé et tout le code était en TFS, donc je suis sûr à 100% que cela fonctionne, j'ai effectué une restauration complète et obtenu la dernière version:

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-System.WEB-20180718085411.mdf;Initial Catalog=aspnet-System.WEB-20180718085411;Integrated Security=True" providerName="System.Data.SqlClient" />
0
Willy David Jr