保存并编辑到数据库(实体框架)

本文关键字:实体 框架 数据库 编辑 保存 | 更新日期: 2023-09-27 17:58:05

我有Like按钮,当它按下时,控制器操作应该向我的dbTable添加字段("Likes"),如果再次按下按钮,它应该会从dbTable中删除Like("Likes")
此处代码(简化):

var like = db.Likes.Find(id);
if (like == null)
{
    Like like = new Like("SomeData", UserPosedLike);    
    db.Add(like);
}
else 
{
    db.Likes.Remove(like);
}
db.SaveChanges();

它在95%的情况下都可以正常工作,但如果我快速按下按钮2-3次,它会抛出错误——"Null ref",Like中的一些数据是Null(但这个数据不能为Null,因为它引用了其他dbField(User))。此外,有时它会添加两个赞,但不应该。

我认为这是因为:

第一个操作(按)-读取数据库,开始处理
第二次操作(第二次按下)-读取数据库,开始处理。(第一个操作尚未保存数据)
第一步(按)–保存数据
第二个操作(pess)-保存数据
我们得到了2个赞。可能存在类似的"null error"问题。

我收到了锁定此代码块的建议,但我认为这是错误的。我也在思考乐观并发,目前正在阅读它

我不擅长数据库,任何帮助都会很棒——好书、代码、文章或建议。非常感谢。

保存并编辑到数据库(实体框架)

您需要在事务中读取写入

using (var db = new YourContext())
{
    using (var t = db.Database.BeginTransaction()) 
    {
        try
        {
            var like = db.Likes.Find(id);
            if (like == null)
            {
                Like like = new Like("SomeData", UserPosedLike);    
                db.Add(like);
            }
            else 
            {
                db.Likes.Remove(like);
            }
            db.SaveChanges();
            t.Commit();
        }
        catch
        {
            t.Rollback();
        }
    }
}

我收到了锁定此代码块的建议,但我认为这是错误的。

这是错误的。

此外,正如有人在评论中建议的那样,您可以阻止用户多次单击某个按钮。您可以禁用该按钮并添加一个微调器。