1

Avoir une relation plusieurs à plusieurs entre les utilisateurs et les messages. Je veux créer de nouvelles valeurs dans la table de poste et la table d'association avec le postID et l'identification de l'utilisateur connecté. Aucun message d'erreur et il semble que je puisse créer un message lorsque j'exécute l'application, mais rien n'est sauvegardé dans une table. Je peux voir quand je lance le débogage il va toutes les étapes, même enregistrer dans la base de données. Qu'est-ce qui ne va pas?Rien enregistré dans la base de données et aucune erreur, plusieurs à plusieurs relation

modèle post

public class Post 
    { 
     public Post() 
     { 
      this.ApplicationUser = new HashSet<ApplicationUser>(); 
     } 

     public int PostId { get; set; } 
     public string Message { get; set; } 
     public DateTime MessageDate { get; set; } 

     public virtual ICollection<ApplicationUser> ApplicationUser { get; set; } 
    } 

IdentityModels

public class ApplicationUser : IdentityUser 
    { 
     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 ApplicationUser() 
     { 
      this.Posts = new HashSet<Post>(); 
     } 

     public virtual ICollection<Post> Posts { get; set; } 
    } 

Et ma fonction de création pour créer un nouveau poste

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "PostId,Message,MessageDate")] Post post) 
    { 
     var manager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     var userId = User.Identity.GetUserId(); 
     var user = manager.FindById(userId); 

     if (ModelState.IsValid) 
     { 
      user.Posts.Add(post); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(post); 
    } 

J'ai des valeurs dans toutes les variables pour l'utilisateur (gestionnaire, userId, user) et trois tables (Posts, AspNetUsers et ApplicationUserPost)

Mise à jour

erreur lorsque je tente Fixer (et solution de CodeNotFound).

Erreur 1 'System.Data.Entity.IDbSet' ne contient pas de définition pour 'findById' et aucune méthode d'extension 'findById' accepter un premier argument de type « System.Data.Entity.IDbSet »pourrait être trouvé (vous manque une directive à l'aide ou une référence d'assemblage?)

erreur 2 « FreePost.Models.ApplicationDbContext » ne contient pas de définition pour « Joindre » et aucune méthode d'extension « Joindre » accepter un premier argument de type 'FreePost.Models.ApplicationDbContext' pourrait être found (yo yo vous manque une directive using ou une référence d'assembly?)

Le premier message d'erreur est la raison pour laquelle j'ai choisi d'utiliser userManager.

+1

I édité ma réponse alors. Vous devez utiliser 'db.Users.Attatch' à la place de' db.Attach'. Et 'db.Users.Find' au lieu de' db.Users.FindById' – CodeNotFound

Répondre

1

Cela ne fonctionne pas car votre db.SaveChanges ne fait rien. Votre contexte ne fait rien car il ne sait rien de l'instance Post que vous tentez d'ajouter.

Pour corriger cela, vous devez d'abord fixer l'instance actuelle de ApplicationUser au contexte comme ci-dessous:

var manager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
var userId = User.Identity.GetUserId(); 
var user = manager.FindById(userId); 

if (ModelState.IsValid) 
{ 
    // Line below you tell your DbContext to take care of ApplicationUser instance. 
    db.Users.Attach(user); 
    user.Posts.Add(post); 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

notes secondaires: Je factoriser votre code comme ceci:

if (ModelState.IsValid) 
{ 
    // Move your code that query the database here so you query your database only if the model is valid. 
    var userId = User.Identity.GetUserId(); 

    // You don't need ApplicationUserManager instance to get the ApplicationUser instance. 
    // If your Post class have a UserId foreign key property then this line is uselesss. 
    // Just set the UserId property of Post class. 
    var user = db.Users.Find(userId); 
    user.Posts.Add(post); 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 
+0

Je reçois deux messages d'erreur lorsque j'essaie cela. J'ai mis à jour mon premier message (trop long pour un commentaire). – Xtreme

+0

@Xtreme J'ai alors édité ma réponse. Vous devez utiliser 'db.Users.Attatch' à la place de' db.Attach'. Et 'db.Users.Find' au lieu de' db.Users.FindById' – CodeNotFound

+0

Fantastique, merci! – Xtreme