调用Reply时用户重复
本文关键字:用户 Reply 调用 | 更新日期: 2023-09-27 17:58:30
我正在尝试使用MVC制作一个简单的论坛,但我不明白为什么发布回复的用户会重复。
以下是回复操作:
[HttpPost]
public ActionResult Reply(string Title, string Content,int ReplyTo)
{
Post masterPost = db.Posts.FirstOrDefault(p => p.PostID == ReplyTo);
Post post = new Post();
post.PostID = 0;
post.CreatedOn = DateTime.Now;
post.ModifiedOn = DateTime.Now;
post.ReplyTo = masterPost;
post.Forum = db.Forums.FirstOrDefault(f=>f.ForumID == masterPost.Forum.ForumID);
post.User = (User)Session["User"];
post.Title = Title;
post.Content = Content;
//if (ModelState.IsValid)
//{
db.Posts.Add(post);
db.SaveChanges();
return RedirectToAction("View", "Posts", new { id = ReplyTo });
//}
return View(post);
}
这是邮政实体:
public class Post
{
[Key]
public int PostID { get; set; }
public string Title { get; set; }
[DataType(DataType.MultilineText)]
public string Content { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime? ModifiedOn { get; set; }
public virtual Forum Forum { get; set; }
public virtual User User { get; set; }
public virtual Post ReplyTo { get; set; }
}
这是用户实体:
public class User
{
public int UserID { get; set; }
public string Name { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public DateTime RegisteredOn { get; set; }
}
每当调用ReplyTo操作时,它都会创建Post,但也会复制存储在会话中的User(使用不同的UserID)。
我做错了什么?
即使您没有声明它,但看起来您使用的是实体框架。
如果是这样,罪魁祸首可能是这条
post.User = (User)Session["User"];
您存储在会话中的"用户"现在已断开与实体框架的连接,因此EF假定它是一个全新的用户。
有几种方法可以解决这个问题。我更喜欢的是还将UserId属性添加到Post类中,并使用该
public class Post
{
// Stuff
public virtual int UserId { get; set; }
}
然后执行:
post.UserId = ((User)Session["User"]).Id;
实体框架使用约定来理解您希望将该用户链接到该帖子。
所以当你说"它也复制了User"时,我得出的结论是,你在DB中的DB后面有一个重复的User类型。保存更改。
假设这是我的假设,那么我推测存储在Session["Usser"]中的User没有现有的UserID属性集,AND/OR您的EF模型没有Post到User多重性关联集。通常,我希望在Post中看到UserId属性,而您上面的示例并没有显示这一点。
检查您的模型以确保在User和Post之间设置了关联,并且有一个外键属性将Post链接到User。Post对象需要一个引用UserId的外键。
请看一下Microsoft示例中的步骤5。