用户和帖子之间有多对多的关系。我想在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的原因。
答案 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");
}