1

我正在尝试使用 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);
}

这是 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 操作时,它都会创建帖子,但它也会复制存储在会话中的用户(具有不同的用户ID)。

我究竟做错了什么?

4

2 回答 2

3

即使您没有说明,看起来您使用的是实体框架。

如果是这样,罪魁祸首可能就是这条线

post.User = (User)Session["User"];

您存储在会话中的“用户”现在与实体框架断开连接,因此 EF 假定它是全新用户。

有几种方法可以解决这个问题。我更喜欢的一个是将 UserId 属性添加到您的 Post 类并使用它

public class Post
{
    // Stuff
    public virtual int UserId { get; set; }
}

然后做:

post.UserId = ((User)Session["User"]).Id;

Entity Framework 使用约定来了解您希望将该用户链接到该帖子。

于 2013-02-09T00:07:27.763 回答
0

因此,当您说“它也复制了用户”时,我得出的结论是,您在 db.SaveChanges 之后在数据库中获得了重复的用户类型。

鉴于我的假设,那么我推测存储在 Session["User"] 中的用户没有现有的 UserID 属性集,并且/或者您的 EF 模型没有 Post to User 多重关联集。通常,我希望在 Post 中看到 UserId 属性,而您上面的示例没有显示这一点。

检查您的模型以确保您在 User 和 Post 之间设置了关联,并且有一个将 Post 链接到 User 的外键属性。Post 对象需要一个引用 UserId 的外键。

看看Microsoft 的这个示例中的第 5 步。

于 2013-02-09T00:18:21.580 回答