数据库中没有保存任何内容,没有错误,多对多关系

时间:2016-10-08 21:47:51

标签: asp.net-mvc entity-framework asp.net-mvc-4 many-to-many code-first

用户和帖子之间有多对多的关系。我想在post表中创建新值,并使用postID和登录用户ID创建关联表。没有错误消息,看起来我可以在运行应用程序时创建帖子,但在任何表中都没有保存。我可以看到,当我运行调试时,它会执行所有步骤,甚至保存到数据库中。怎么了?

发布模型

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; }
    }

我的创建函数创建一个新帖子

    [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);
    }

我在用户(manager,userId,user)和三个表(Posts,AspNetUsers和ApplicationUserPost)的所有变量中都有值

更新

尝试附加(和CodeNotFound中的解决方案)时出错。

  

错误1'System.Data.Entity.IDbSet'   不包含'FindById'的定义,也没有扩展方法   'FindById'接受第一个类型的参数   'System.Data.Entity.IDbSet'可以   发现(您是否缺少using指令或程序集引用?)

     

错误2'FreePost.Models.ApplicationDbContext'不包含   'Attach'的定义,没有扩展方法'Attach'接受a   “FreePost.Models.ApplicationDbContext”类型的第一个参数可以是   发现(您是否缺少using指令或程序集引用?)

第一条错误消息是我选择使用userManager的原因。

1 个答案:

答案 0 :(得分:1)

它不起作用,因为你的db.SaveChanges什么都不做。您的上下文不执行任何操作,因为它对您尝试添加的Post实例一无所知。

要解决此问题,您需要先将ApplicationUser的当前实例附加到上下文中:

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");
}

附注:我会像这样重构您的代码:

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");
}