如何通过单击按钮增加数据库列中的值

时间:2019-03-31 16:33:14

标签: c# asp.net entity-framework

作为我正在研究的项目的一部分,用户可以创建一个帖子,然后其他用户可以单击“喜欢”或“不喜欢”按钮。

下面的代码是Post.cs类,负责将表添加到数据库中。

public class Post
{
    //The post ID
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int postId { get; set; }
    // Foreign key to customer

    public string Id { get; set; }
    public string Email { get; set; }
    public string postTitle { get; set; }
    public string postBody { get; set; }
    public string postDepartment { get; set; }
    public string postCategory { get; set; }
    public bool postAnonymous { get; set; }
    public int postLikes { get; set; }
    public int postDislikes { get; set; }
    public DateTime postDate { get; set; }
}

以下代码是链接到两个按钮的后端C#代码。

protected void btnLike_Click(object sender, EventArgs e)
{

}

protected void btnDislike_Click(object sender, EventArgs e)
{

}

我正在尝试让按钮在每次单击时使数据库中的整数值增加+1,并且用户应该只能单击任一按钮,而又不能多次//不喜欢//。

我将如何尝试使用asp.net网络表单成功完成此操作。

<------------------编辑-------------------------> < / p>

protected void btnLike_Click(object sender, EventArgs e)
{
    var postIDforLike = // add logic to get the id of the post to increment the likes
    using (var _dbContext = new ApplicationDbContext()) 
    {
        var addLikeSql = "update post set postLikes = postLikes + 1 where postID = @id";
        var paramID = new SqlParameter("@id", postIDforLike);
        _dbContext.Database.ExecuteSqlCommand(addLikeSql, paramID);
    }
}

<-------------------------- EDIT2 ------------------- ---->

<asp:Button ID="btnLike" class="btn btn-primary" runat="server" Text=" Like" Width="99.99px" OnClick="btnLike_Click" />&nbsp <asp:Button ID="btnDislike" Width="99.99px" class="btn btn-primary" runat="server" Text="Dislike " OnClick="btnDislike_Click"  />

        </div>
    <br />
         <%--------------------------------------
          Inserting Comment Information
          --------------------------------------%>
 <div class="col-md-12">
            <div class="panel panel-primary">
                  <div class="panel-heading">
    <h3 class="panel-title text-center">Add Comment</h3>
  </div>

  <div class="panel-body">


      <fieldset>
      <table class="nav-justified">
          <tr>
              <td class="modal-sm" style="width: 237px; height: 21px;">
      <label for="commentBody" class="col-lg-2 control-label">Comment:</label></td>
              <td style="width: 434px; height: 21px;">    
         <asp:TextBox Width="400px" style="resize:none;" class="form-control" ID="commentBody" runat="server" placeholder="Body" TextMode="MultiLine"></asp:TextBox>
              </td>
              <td style="height: 21px">    
                  <asp:RequiredFieldValidator controltovalidate="commentBody" ID="commentBodyValidator" runat="server" ErrorMessage="*Comment is required" ForeColor="Red"></asp:RequiredFieldValidator>    
              </td>
          </tr>
          </table>
      <br />
      <table class="nav-justified">
          <tr>
              <td style="height: 21px; width: 511px">    
      <label for="commentAnonymous" class="col-lg-2 control-label" style="left: 0px; top: 0px; width: 538px">Would you like this comment to be submitted anonymously?:</label></td>
              <td style="height: 21px; width: 104px">    
      <asp:RadioButtonList ID="commentAnonymous" runat="server" BorderStyle="None" CellPadding="0" CellSpacing="0">
        <asp:ListItem Value="1" Text="Yes">Yes</asp:ListItem>
        <asp:ListItem Value="0" Text="No">No</asp:ListItem>
    </asp:RadioButtonList>  
              </td>
              <td style="height: 21px"><asp:RequiredFieldValidator controltovalidate="commentAnonymous" ID="commentAnonymousValidator" runat="server" ErrorMessage="*Please select an option" ForeColor="Red"></asp:RequiredFieldValidator>    
              </td>
          </tr>
      </table>
      <br />
      <table class="nav-justified">
          <tr>
              <td class="modal-sm" style="width: 408px">&nbsp;</td>
              <td>
        <button type="reset" class="btn btn-default">Cancel</button>
          <asp:Button  class="btn btn-default" ID="commentSubmitBtn" runat="server" autopostback="false" onclick="AddComment" Text="Submit" />
              </td>
              <td>&nbsp;</td>
          </tr>
      </table>
          </fieldset>
                      <hr>

      <table class="display" id="commentsTable">
        <thead>
            <tr>
                <th>Comment</th>
                <th>User</th>
                <th>Date</th>

            </tr>
        </thead>
        <tbody>

        </tbody>
    </table>

2 个答案:

答案 0 :(得分:0)

我假设您使用实体框架(基于post类中使用的属性)。

最简单的方法是加载实体,增加值,然后调用SaveChanges。但是,如果不使用锁定机制,这将非常低效且危险。

您可能正在寻找的是

update post set postLikes = postLikes + 1 where postID = @id

命令。这本来会更有效,因为您不必在更新Likes值之前每次都加载整个帖子。您可以使用上下文的Database.ExecuteSqlCommand执行这样的Sql Commands。

另一种可能的解决方案是通过添加“喜欢和不喜欢的表”来更改数据库模型,在其中为每个喜欢/不喜欢的人添加一条记录。要获得当前的点赞次数,您必须计算与该帖子相关的记录数。这样会增加开销,但具有的优点是您不会创建瓶颈,因为每次要更新like字段时,数据库都必须锁定您的帖子记录。

答案 1 :(得分:0)

///您需要有一个新表来处理类似用户帖子的内容 //具有UserId int PostId int的UserLike表喜欢或不喜欢,因此您不需要实体上的喜欢和不喜欢属性! //假设此操作可以由用户登录完成。

protected void btnLike_Click(object sender, EventArgs e)
        {
//you need to get postId while button clicked... 
            DBContext db = new DbContext();
            var user = Session["loggedUser"] as User ;
            var didUserLike = db.Post.Where(p=>p.PostId == postId).Select(x=>x.UserId == user.UserId).FirstOrDefault());
if(didUserLike.Count() > 0){

//Operation like enable button disable button!
}   //and if you want to do it for dislike..yes you can
        }

对不起,我在这里没有工作室或代码,我无法控制。但是我认为您了解结构。祝你有美好的一天。

已编辑(已添加):

并且在视图中您不需要从enetiyt的属性中显示,因为可以通过查询来计算。这不适用于数据库设计。

,您可以这样做;

  public int likeCountForPost(int id){
      var postLikes = db.PostLikes.Where(x=>x.PostId == id && x.PostLike==1).Count();
      return  postLikes;
}

您也可以通过将不喜欢的返回计数仅更改为1到2来做到这一点。