2013-05-27 3 views
1

MVC4 en utilisant db d'abord avec la simplicité d'appartenanceComment interroger la base de données simplemembership

J'ai mon abonnement de travail au point où je peux enregistrer un nouvel utilisateur. Une fois que la personne est inscrite, j'ai besoin d'afficher une nouvelle vue pour pouvoir ajouter plus d'informations. J'ai donc besoin de l'ID utilisateur nouvellement créé depuis la table UserProfile pour passer à la nouvelle vue. J'ai essayé de modifier la méthode de registre à ce templated:

  try 
      { 
       WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { Email = model.Email }, true); 
       WebSecurity.Login(model.UserName, model.Password); 

//Get the userid for this new user 
       var db = new UsersContext(); 
       int id = db.UserProfiles.Where(x => x.UserName == model.UserName).Select(x => x.UserId).FirstOrDefault(); 

       return RedirectToAction("Edit", "Profile", id); 
      } 

Cela me donne cette erreur:

\ tSystem.Data.Entity.Edm.EdmEntityType:: EntityType 'UserProfile' n'a pas de clé définie. Définissez la clé pour cet EntityType. \ tSystem.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'UserProfiles' est basé sur le type 'UserProfile' qui n'a aucune clé définie. Je crois que cette erreur a quelque chose à voir avec essayer d'utiliser EF sur une table qui n'est pas dans un modèle EDMX. Je n'ai ajouté aucune des tables d'adhésion simplifiée (UserProfile, Membership, Roles, etc.) dans mon fichier edmx car lorsque je fais cela, j'obtiens des erreurs de classes en double, je suppose que les tables SM sont créées en premier.

Je n'ai jamais fait de code en premier, la réponse est là? Ou dois-je ajouter les tables SM à mon modèle edmx pour pouvoir les interroger. Si oui, comment puis-je contourner l'erreur de classe en double?

J'ai les 2 chaînes de connexion séparées dans ma configuration web.

EDIT ++++++++++

J'ai fait des recherches et a trouvé une autre façon, mais je reçois la même erreur.

   int id; 
       using (var db = new UsersContext()) 
       { 
        var user = db.UserProfiles.Find(model.UserName); 
        id = user.UserId; 
       } 

Je reçois l'erreur sur la ligne 'using'. Voici le code pour le UsersContext:

public class UsersContext : DbContext 
{ 
    public UsersContext() 
     : base("SecurityEntities") 
    { 
    } 

    public DbSet<UserProfile> UserProfiles { get; set; } 
} 

« SecurityEntities est la chaîne de connexion qui ressemble à:

<add name="SecurityEntities" connectionString="data source=(localdb)\v11.0;initial catalog=OurAgreements;user id=oaadmin;password=136VDSyPLrcfgPfw3BIH;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" /> 

Pouvez-vous voir où je me trompe

Répondre

1

Qu'est-ce que votre définition UserProfile ressembler à ceci:

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
    ... 
} 

La clé attribut indique que le UserId est la clé et la DatabaseGeneratedAttribute indique que la valeur UserId est générée par la base de données. L'erreur que vous obtenez semble indiquer que vous n'avez pas l'attribut Key sur votre UserProfile définition.

Mise à jour 5/29/13

Si vous rencontrez des problèmes avec la modification du schéma pour UserProfile et il est pas configuré pour la migration jeter un oeil à cet article qui montre how to customize and seed SimpleMembership.La configuration de cet article est davantage orientée vers le développement et le test de votre application. Il y a un autre article sur setting up database migration for SimpleMembership.

+0

Merci Kevin pour répondre. J'ajoute les attributs de clé et d'identité, ce qui a permis d'exécuter la requête, mais elle revient à zéro. J'ai ensuite ajouté l'attribut 'Table' et il a erré en disant que la base de données a changé et que je devrais utiliser les migrations. Je ne peux pas simplement me débarrasser du modèle UserProfile et ajouter la table à mon fichier edmx et l'utiliser comme une connexion ef normale? Je n'ai jamais fait de code en premier. – BattlFrog

+0

S'il vous plaît jeter un oeil à ma réponse mise à jour. –

0

J'ai essayé

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, null, false); 
var ID = WebSecurity.GetUserId(model.UserName); 

et il fonctionne bien pour moi

Questions connexes